如何 select 我的 table 范围

How to select a range of my table

我有一个 table 这样的: (注意每个单词的序号)

// tablename
+---------+----------+
|  word   |  number  |
----------------------
|  jack   |     1    |
|  jack   |     2    |
|  jack   |     3    |
|  ali    |     1    |
|  ali    |     2    |
|  ali    |     3    |
|  ali    |     4    |
|  ali    |     5    |
|  peter  |     1    |
|  peter  |     2    |
|  peter  |     3    |
|  peter  |     4    |
|  raj    |     1    |
|  raj    |     2    |
+---------+----------+

现在我需要查询 select 一个范围。我的范围是(例如):

// Range Start
select * from tablename where word='ali' and number='2';

// Range End
select * from tablename where word='peter' and number='3';

事实上我想要以下结果:

+---------+----------+
|  word   |  number  |
----------------------
|  ali    |     2    |
|  ali    |     3    |
|  ali    |     4    |
|  ali    |     5    |
|  peter  |     1    |
|  peter  |     2    |
|  peter  |     3    |
+---------+----------+

我该怎么做?

试试这个:

select * from table 
where (word = 'ali' and number >='2') or (word = 'peter' and number <= '3')
order by word, number
select * from tablename
where (word = 'ali' and number between '2' and '5') OR
      (word = 'peter' and number between '1' and'3')
order by word, number

我得走了,但如果您的数据在 ID 列中看起来像这样:

+---------+----------+----+
|  word   |  number  | ID |
---------------------------
|  jack   |     1    | 1  |
|  jack   |     2    | 2  |
|  jack   |     3    | 3  |
|  ali    |     1    | 4  |
|  ali    |     2    | 5  |
|  ali    |     3    | 6  |
|  ali    |     4    | 7  |
|  ali    |     5    | 8  |
|  peter  |     1    | 9  |
|  peter  |     2    | 10 |
|  peter  |     3    | 11 |
|  peter  |     4    | 12 |
|  raj    |     1    | 13 |
|  raj    |     2    | 14 |
+---------+----------+----+

那么你可以这样做(这只是一种方式,很可能还有更多优化方式)

select *
from table
where id >= (select id from table where word='ali' and number='2')
 and id <= (select id from table where word='peter' and number='3')

假设您希望数据首先按 word 排序,然后按 number 排序,您可以这样做:

select * from table
    where strcmp(concat(word, lpad(number, 5, '0')), concat('ali', lpad(2, 5, '0'))) >= 0
    and strcmp(concat(word, lpad(number, 5, '0')), concat('peter', lpad(3, 5, '0'))) <= 0
    order by word asc, number asc;

这需要两个字段,并生成一个 ASCII 字符串 nameNNNNN 以进行比较。这将独立于记录 ID 的顺序工作。如果您的 wordnumber 被设置为复合索引,您可以基于它进行排序而不使用字符串比较和连接。

如果您有 Id 列,这是一种满足您需要的简单方法

SELECT
  word, number 
FROM 
  Test 
WHERE 
  id BETWEEN
    (SELECT id FROM Test WHERE word = 'ali' AND number = '2') AND
    (SELECT id FROM Test WHERE word = 'peter' AND number = '3');

Here 你在 SQLFiddle 中有一个工作示例

希望对您有所帮助

    select * from tablename where 
(word = 'ali' and number >= 2) or 
(word = 'peter' and number <= 3);

应该会产生您正在寻找的结果,但如果您有一个在 table 中唯一的主键作为索引,您可以简单地查询 table 使用类似这;

select * from tablename where index between x and y;

这显然表明您知道所需的索引值,尽管您可以使用像这样的嵌套条件获得这些值;

    select * from tablename where index between 
(select index from tablename where name = 'ali' and number =2) and 
(select index from tablename where name=peter and number = 5);

希望对您有所帮助。