2009-09-24 2 views
3

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

select * FROM table WHERE id in (1, 2, 3, 10, 100); 

И я получаю результаты возвращаются в следующем порядке: 1, 2, 3, 10, 100

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

select * FROM table WHERE id in (2, 100, 3, 1, 10); 

Я все еще получаю результаты возвращаются в том же порядке: 1, 2, 3, 10, 100

Есть ли способ, чтобы получить результаты, возвращенные в том же порядке, что я прошу?

(Есть ограничения, связанные с тем, как сайт создан, что не позволит мне ORDER BY с использованием другого значения поля)

ответ

3

Если вы не в состоянии сделать ORDER BY, нет гарантированного способа.

Рода вы получаете из-за пути MySQL выполняет запрос: он сочетает в себе все range сканирование в диапазонах, определенных IN списка в одну range сканирования.

Обычно, вы вынуждаете заказ, используя один из следующих способов:

  1. Создать временную таблицу со значением и сортировщика, заполнить его с вашими ценностями и порядком в sorter:

    CREATE TABLE t_values (value INT NOT NULL PRIMARY KEY, sorter INT NOT NULL) 
    
    INSERT 
    INTO t_values 
    VALUES 
    (2, 1), 
    (100, 1), 
    (3, 1), 
    (1, 1), 
    (10, 1); 
    
    SELECT m.* 
    FROM t_values v 
    JOIN mytable m 
    ON  m.id = v.value 
    ORDER BY 
         sorter 
    
  2. Сделайте то же самое с строк на месте:

    SELECT m.* 
    FROM (
         SELECT 2 AS value, 1 AS sorter 
         UNION ALL 
         SELECT 100 AS value, 2 AS sorter 
         UNION ALL 
         SELECT 3 AS value, 3 AS sorter 
         UNION ALL 
         SELECT 1 AS value, 4 AS sorter 
         UNION ALL 
         SELECT 10 AS value, 5 AS sorter 
         ) 
    JOIN mytable m 
    ON  m.id = v.value 
    ORDER BY 
         sorter 
    
  3. Использование CASE пункт:

    SELECT * 
    FROM mytable m 
    WHERE id IN (1, 2, 3, 10, 100) 
    ORDER BY 
         CASE id 
         WHEN 2 THEN 1 
         WHEN 100 THEN 2 
         WHEN 3 THEN 3 
         WHEN 1 THEN 4 
         WHEN 10 THEN 5 
         END 
    
+0

** Ти W ** 'ы раствора ниже улучшенный (как и в более короткий путь) версии # 3 – ChssPly76

1

Вы можете наложить заказ, но только на основе стоимости (ов) из одного или нескольких столбцов.

Чтобы получить строки в порядке, указанном в примере, вам нужно будет добавить второй столбец, называемый «sortkey», значения которого могут использоваться для сортировки строк в нужной последовательности, с использованием ORDER BY пункт. В вашем примере:

Value Sortkey 
----- ------- 
    1   4 
    2   1 
    3   3 
10   5 
100   2 

select value FROM table where ... order by sortkey; 
7

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

SELECT * 
FROM table 
WHERE id in (2, 100, 3, 1, 10) 
ORDER BY FIELD (id, 2, 100, 3, 1, 10) 
+0

+1. Это лучше, чем FIND_IN_SET(), который я использовал. – ChssPly76

+0

Правда. +1. – Quassnoi

+0

Это прекрасно, пока набор невелик, но замените «in», установленным подзапросом, и вам нужно будет иметь столбец sortkey в таблице. –

Смежные вопросы