Как мне объединить полные наборы результатов в MySQL?

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

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)

Решение

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

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

Я не понимаю, зачем нужно объединение для взятия данных из одной таблицы

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

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

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

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

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

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

ВЫБЕРИТЕ отличные a, b, c FROM (SELECT A, B, C, 1 как o FROM table WHERE field LIKE 'query%' UNION SELECT A, B, C, 2 as o FROM table WHERE field LIKE '% query' UNION SELECT A, B, C, 3 как o FROM table WHERE field LIKE '% query%') ORDER BY o ASC LIMIT 5

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

Я не понимаю

GROUP BY B ORDER BY B ASC LIMIT 5

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

Действительно ли mysql позволяет группировать по столбцу и при этом не выполнять агрегирование по другим столбцам?

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

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

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) и набор результатов с подстановочными знаками, следующий сразу за ним.

:)

/ мп

Есть две разновидности UNION.

'UNION' and 'UNION ALL'

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

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