选择第一个和最后两个元素

时间:2010-04-07 21:59:55

标签: mysql select

嗨我有一个包含这些元素的表

id name
1 luke
2 johnny
3 perry
4 jenny
5 mark

我必须做一个第一个元素和持续2的查询 我这个例子

1 luke
4 jenny
5 mark

我该怎么办?

感谢

4 个答案:

答案 0 :(得分:3)

我认为你不能用一个查询来做到这一点:我会说你必须使用两个查询:

一,获得第一个结果:

select *
from your_table
order by id asc
limit 1


另外一个是得到最后两个结果 - 在相反方向排序并获得前两个结果将会有效:

select *
from your_table
order by id desc
limit 2


之后,您可以只发送一个查询,而不是从编程语言向SQL服务器发出两个请求,而是使用UNION来获取两者的结果:

(select * from your_table order by id asc limit 1)
UNION
(select * from your_table order by id desc limit 2)

但是,考虑一下......不确定这实际上是否可行,在每个子查询中都有一个带有order by和limit的UNION ......



编辑:我做了测试,似乎有可能:

以下是两个独立执行的查询:

mysql> select id, title from post order by id asc limit 1;
+----+--------------+
| id | title        |
+----+--------------+
|  1 | Premier post |
+----+--------------+
1 row in set (0,00 sec)

mysql> select id, title from post order by id desc limit 2;
+----+-------------------------+
| id | title                   |
+----+-------------------------+
|  7 | Septième post          |
|  6 | Sixième post (draft=7) |
+----+-------------------------+
2 rows in set (0,00 sec)

以下是UNION的样子:

mysql> (select id, title from post order by id asc limit 1) UNION (select id, title from post order by id desc limit 2);                                                                                                                                                       
+----+-------------------------+
| id | title                   |
+----+-------------------------+
|  1 | Premier post            |
|  7 | Septième post          |
|  6 | Sixième post (draft=7) |
+----+-------------------------+
3 rows in set (0,03 sec)

但请注意,3个结果行的顺序定义不太明确......


并且,引用MySQL 5.1的以下手册页:12.2.8.3. UNION Syntax

  

将ORDER BY或LIMIT应用于   个别SELECT,放置子句   在括起来的括号内   SELECT:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
     

但是,使用ORDER BY   各个SELECT语句暗示   没有关于的顺序   行出现在最终结果中   因为UNION默认生成一个   无序的行集。

答案 1 :(得分:1)

的联合以某种方式结合(a)顶部,升序排序,(b)前两个,排序降序。

答案 2 :(得分:0)

在两个查询中:

select * from table order by id asc limit 1
select * from table order by id desc limit 2

我不确定你是否可以在mysql中的2个查询中执行此操作。你可以在ms-sql中这样做:

select * from table order by id asc limit 1
union all
select * from table order by id desc limit 2

答案 3 :(得分:0)

嗯,在一个查询中执行它并不是很好(尤其是从MySQL doesn't support LIMIT in IN subqueries开始),但这是可能的(但是子查询有点作弊):

SELECT id, name
FROM table
WHERE id = (SELECT id FROM table ORDER BY id LIMIT 1)
    OR id = (SELECT id FROM table ORDER BY id DESC LIMIT 1)
    OR id = (SELECT id FROM table ORDER BY id DESC LIMIT 1,1)