MySQL заказ с союзом, кажется, не работает - PullRequest
16 голосов
/ 31 декабря 2011

Вот мой запрос

(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only three doors%" OR `joke` LIKE "%only three doors%") ORDER BY `ups` DESC,`downs` ASC)
UNION
(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only%" OR `joke` LIKE "%only%") ORDER BY `ups` DESC,`downs` ASC)
UNION
(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%three%" OR `joke` LIKE "%three%") ORDER BY `ups` DESC,`downs` ASC)
UNION
(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%doors%" OR `joke` LIKE "%doors%") ORDER BY `ups` DESC,`downs` ASC)
 LIMIT 0, 30

По какой-то причине он, похоже, не упорядочен по типу взлетов или падений ... он просто отбрасывает мне результаты в том порядке, в котором они, естественно, находятся в базе данных.

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

Я также не хочу упорядочивать по всем результатам,или я бы поставил LIMIT 0,30 Order By blah

Ответы [ 4 ]

24 голосов
/ 31 декабря 2011

Из MySQL документация :

... использование ORDER BY для отдельных операторов SELECT подразумевает ничего о порядке, в котором строки появляются в конечном результате потому что UNION по умолчанию создает неупорядоченный набор строк.

По сути, единственное время, когда ORDER в объединении будет полезен, это если вы также используете LIMIT.

Итак, если ваш запрос был таким:

(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only three doors%" OR `joke` LIKE "%only three doors%") ORDER BY `ups` DESC,`downs` ASC LIMIT 10)
UNION ...

Тогда вы увидите первые десять записей, которые будут возвращены на основе этого порядка, но они не обязательно будут отображаться по порядку.

UPDATE:

Попробуйте это -

(SELECT *, 1 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only three doors%" OR `joke` LIKE "%only three doors%") )
UNION
(SELECT *, 2 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only%" OR `joke` LIKE "%only%") )
UNION
(SELECT *, 3 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%three%" OR `joke` LIKE "%three%") )
UNION
(SELECT *, 4 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%doors%" OR `joke` LIKE "%doors%"))
 ORDER BY `ob`, `ups` DESC,`downs` ASC LIMIT 0, 30
3 голосов
/ 19 августа 2015

Я получил решение для этого:

SELECT *
FROM (
    (SELECT 1 as SortRank, uid, title, state, zip, region,cantone FROM company WHERE city=".$city." AND region=".$region." AND cantone=".$cantone.")
     UNION
    (SELECT 2 as SortRank, uid, title, state, zip, region,cantone FROM company WHERE region=".$region." AND cantone=".$cantone.")
    union all
    (SELECT 3 as SortRank, uid, title, state, zip, region,cantone FROM company WHERE cantone=".$cantone.")
) As u
GROUP BY uid 
ORDER BY SortRank,state=2, title ASC
LIMIT 0,10

В приведенном выше запросе я хочу, например, результат. сначала показать все записи с указанием города, региона и кантона, затем, если город недоступен, затем показать все записи с указанием региона и кантона, а затем все записи с кантоном города. Таким образом, удаляя повторяющиеся записи, которые я использовал в предложении GROUP BY, он отсортирует все записи на основе группы запросов, а затем все записи с состоянием = 2.

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

Что делает запрос, так это упорядочивает каждый подзапрос отдельно и объединяет их все. Нет гарантии, что результат будет заказан.

Вам нужно заказать единый запрос следующим образом:

Select * from (
  (SELECT *, 1 as `p` FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only three doors%" OR `joke` LIKE "%only three doors%"))
  UNION
  (SELECT *, 2 as `p` FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only%" OR `joke` LIKE "%only%"))
  UNION
   (SELECT *, 3 as `p` FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%three%" OR `joke` LIKE  "%three%"))
  UNION
  (SELECT *, 4 as `p` FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%doors%" OR `joke` LIKE "%doors%"))
    ) ORDER BY `p` ASC, `ups` DESC,`downs` ASC
0 голосов
/ 31 декабря 2011

Вы сможете использовать UNION ALL для удаления дубликатов (а также для полной сортировки набора результатов).При этом набор результатов должен быть в порядке операторов выбора в запросе.

...