Как я могу объединить все наборы результатов в MySQL? - PullRequest
20 голосов
/ 06 августа 2008

Я пробую следующий запрос:

SELECT A,B,C FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY B ASC LIMIT 5

Это три запроса, вроде как. Однако возвращаемый набор результатов отражает результаты запроса № 3 до результатов запроса № 1, что нежелательно.

Можно ли как-то расставить приоритеты, чтобы результаты пришли как все для запроса № 1, затем все для запроса № 2, затем все для запроса № 3? Я пока не хочу делать это в PHP (не говоря уже о необходимости контролировать результаты, которые отображаются в первом запросе, а не во втором и т. Д.).

Ответы [ 8 ]

16 голосов
/ 06 августа 2008

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

SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE '%query%'
GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5
7 голосов
/ 06 августа 2008

Добавьте дополнительный столбец с жестко закодированными значениями, которые вы будете использовать для сортировки общего набора результатов, например:

SELECT A,B,C,1 as [order] FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C,2 as [order] FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C,3 as [order] FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5
2 голосов
/ 06 августа 2008

Можете ли вы сделать это как подвыбор, что-то вроде

SELECT * FROM (
    SELECT A,B,C FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query%'
) ORDER BY B ASC LIMIT 5
1 голос
/ 06 августа 2008

ВЫБЕРИТЕ отличные a, b, c ОТ ( ВЫБЕРИТЕ A, B, C, 1 как o ИЗ таблицы, ГДЕ поле LIKE 'query%' UNION ВЫБЕРИТЕ A, B, C, 2 как o ИЗ таблицы ГДЕ поле LIKE '% query' UNION ВЫБЕРИТЕ A, B, C, 3 как o ИЗ таблицы, ГДЕ поле LIKE '% query%' ) ЗАКАЗАТЬ ПО ОГРАНИЧЕНИЮ ASC 5

Был бы мой способ сделать это. Я не знаю, как это масштабируется.

Я не понимаю

GROUP BY B ORDER BY B ASC LIMIT 5

Это относится только к последнему SELECT в объединении?

Позволяет ли MySQL на самом деле группировать по столбцу и все еще не выполнять агрегирование по другим столбцам?

РЕДАКТИРОВАТЬ: ааааа. Я вижу, что MySQL действительно делает. Это специальная версия DISTINCT (б) или что-то. Я не хотел бы пытаться быть экспертом в этой области:)

0 голосов
/ 20 мая 2019

Я не понимаю, почему нужен союз для получения данных из одной таблицы SELECT A ,B ,C FROM table WHERE field LIKE 'query%' or field LIKE '%query' or field LIKE '%query%' GROUP BY B ORDER BY B ASC LIMIT 5

0 голосов
/ 17 сентября 2008

Существует два варианта UNION.

'UNION' and 'UNION ALL'

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

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

0 голосов
/ 06 августа 2008

Я в конечном итоге (просматривая все предложения) пришёл к этому решению, это немного компромисс между тем, что мне нужно, и временем.

SELECT * FROM 
  (SELECT A, B, C, "1" FROM table WHERE B LIKE 'query%' LIMIT 3
   UNION
   SELECT A, B, C, "2" FROM table WHERE B LIKE '%query%' LIMIT 5)
AS RS
GROUP BY B
ORDER BY 1 DESC

он выдает всего 5 результатов, сортирует по четвертому «столбцу» и дает мне то, что мне нужно; естественный набор результатов (он идет через AJAX) и набор подстановочных знаков, следующий сразу после.

:)

/ * т.пл. 1008 *

0 голосов
/ 06 августа 2008

Если нет такой сортировки, которая имеет смысл упорядочивать их по вашему желанию, не объединяйте результаты вместе - просто верните 3 отдельных набора записей и обработайте их соответствующим образом на уровне данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...