Заказ SQL-запроса в определенном порядке - PullRequest
1 голос
/ 21 декабря 2011

Допустим, у меня есть таблица Guest и столбец g_id: значения от 1 до 10.

Теперь я хочу, чтобы запрос вернул мне g_id ни в порядке возрастания, ни в порядке убывания. но я хочу 4-й, 3-й и 5-й записи, в этом конкретном порядке. Также я хочу только 4-ю 3-ю и 5-ю запись.

говорят, что мои записи имеют идентификатор и имя. ; То есть. Мой стол Гость имеет эти две таблицы. Теперь моя таблица выглядит следующим образом.

1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
9 I
10 J

Теперь я хочу только запись с 4-м 3-м и 5-м g_id, и в этом конкретном порядке.

Как мне написать SQL-запрос? Спасибо.

Выбрать * из Гость _ __ _ __ _ ____ ???

Пожалуйста, заполните пробелы.

Ответы [ 6 ]

2 голосов
/ 21 декабря 2011

Вы можете использовать оператор CASE в вашем ORDER BY, чтобы использовать поддельный столбец для сортировки, и предложение WHERE IN, чтобы возвращать только те значения, которые вам нужны.

SELECT * 
FROM   Guest
WHERE  g_id IN (3, 4, 5)
ORDER BY
       CASE WHEN g_id = 4 THEN 1
            WHEN g_id = 3 THEN 2
            WHEN g_id = 5 THEN 3
       END
2 голосов
/ 21 декабря 2011

Какой порядок определяет, является ли что-то четвертым, третьим или пятым? Без предложения ORDER BY данные возвращаются в неопределенном порядке SQL. Вы не можете полагаться на порядок, в котором строки вводятся или хранятся в самой таблице базы данных.

Вы можете жестко закодировать то, что вы спрашиваете так:

select *
from Guest
order by case 
    when g_id = 4 then 1
    when g_id = 3 then 2
    when g_id = 5 then 3
    else 4
end
0 голосов
/ 21 декабря 2011

В этом запросе вы получите 3-й, 5-й и 4-й элементы (limit 2, 1 означает «получить, начиная с 3-го элемента, с общим количеством извлеченных = 1 записей)

(select g_id from Guest limit 2,1)
UNION (select g_id from Guest limit 4,1
UNION (select g_id from Guest limit 3,1)
0 голосов
/ 21 декабря 2011

Я думаю, что ответ в основном зависит от СУБД, с которой вы работаете.

В Oracle приведенный ниже запрос, хотя и неэффективный, должен работать

select * from 
    (select * , rownum as order from guest order by id asc ) b 
where b.order = 4
UNION
select * from 
    (select * , rownum as order from guest order by id asc ) b 
where b.order = 3
UNION
select * from 
    (select * , rownum as order from guest order by id asc ) b 
where b.order = 5

Не уверен, что что-то изс простым запросом можно добиться большей эффективности, я бы использовал приведенное выше только для монстра, и только если запрашиваемая таблица очень мала.

У вас также есть другой вариант, если таблица большая и вам нужно только извлечьпервые строки.В случае, который вы описали, я бы извлек первые 5 строк, а затем программно извлек бы строки в позиции 4,3,5.

вы можете извлечь первые 5 строк с помощью этого запроса в oracle

select * from guest order by id asc where rownum < 6
0 голосов
/ 21 декабря 2011

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

ORDER BY
   g_id = 4 DESC,
   g_id = 3 DESC,
   g_id = 5 DESC

Возможно, вам лучше выбрать записи такими, какие они есть, и делать что-то подобное в вашем phpкод:

$order = array('4 ', '3 ', '5 ');
$data = array();
while ($row = $result->fetch()) {
   $data["$row->g_id "] = $row;
}
$data = array_merge(array_flip($order), $data);
0 голосов
/ 21 декабря 2011

Одним из решений является оператор case:

select g_id from (
    select g_id, case g_id
       when 4 then 1
       when 3 then 2
       when 5 then 3
       else 0
    end virtcol
    where virtcol != 0
    order by virtcol
);
...