Подтвердить что ты не робот

Как объединить все наборы результатов в 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 (не говоря уже о том, что нужно контролировать результаты, показанные в первом запросе, а не показывать во втором и т.д.).

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

SELECT выделяет a, b, c FROM (       SELECT A, B, C, 1 как o FROM table WHERE поле LIKE 'query%'       UNION       SELECT A, B, C, 2 как o FROM table WHERE поле LIKE '% query'       UNION       SELECT A, B, C, 3 как o из таблицы WHERE поле LIKE '% query%'   )   ORDER BY o ASC LIMIT 5

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

Я не понимаю

GROUP BY B ORDER BY B ASC LIMIT 5

Используется ли это только для последнего SELECT в объединении?

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

EDIT: aaahh. Я вижу, что mysql действительно делает. Это специальная версия DISTINCT (b) или что-то еще. Я бы не хотел быть экспертом в этой области:)

Ответ 5

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

Ответ 6

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

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

:)

/тр

Ответ 7

Существует два параметра UNION.

'UNION' and 'UNION ALL'

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

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

Ответ 8

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

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