выберите первый и последние два элемента - PullRequest
2 голосов
/ 08 апреля 2010

привет, у меня есть таблица с этими элементами

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

Я должен сделать запрос, который берет первый элемент и длится 2 в этом примере

1 luke
4 jenny
5 mark

как мне это сделать?

спасибо

Ответы [ 4 ]

3 голосов
/ 08 апреля 2010

Я не думаю, что вы можете сделать это одним запросом: я бы сказал, что вам придется использовать два запроса:

Один, чтобы получить первый результат:

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)

Но, подумав об этом ... не уверенна самом деле это возможно, если в каждом подзапросе есть 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-х результирующих строк не очень хорошо определен ...


И, qиспользуя следующую страницу руководства MySQL 5.1: 12.2.8.3.Синтаксис UNION :

Чтобы применить 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 голос
/ 08 апреля 2010

Возьмите объединение Объедините как-то (а) верхний, сортировка по возрастанию, (б) два верхних, сортировка по убыванию.

0 голосов
/ 08 апреля 2010

Что ж, это не очень приятно делать в одном запросе (тем более, что MySQL не поддерживает LIMIT в IN подзапросах ), но это возможно (но подзапросы - это обман)

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)
0 голосов
/ 08 апреля 2010

В двух запросах:

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

Я не уверен, что вы можете сделать это за 2 запроса в MySQLВы можете сделать это так в ms-sql:

select * from table order by id asc limit 1
union all
select * from table order by id desc limit 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...