如何 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 的顺序工作。如果您的 word
和 number
被设置为复合索引,您可以基于它进行排序而不使用字符串比较和连接。
如果您有 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);
希望对您有所帮助。
我有一个 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 的顺序工作。如果您的 word
和 number
被设置为复合索引,您可以基于它进行排序而不使用字符串比较和连接。
如果您有 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);
希望对您有所帮助。