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

StackOverflow https://stackoverflow.com/questions/3839

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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,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

Выберите различные a, b, c from (выберите a, b, c, 1 как o o из таблицы, где поле, подобное «Query%», объединение выберите a, b, c, 2 как o из таблицы, где поле «%Query» Select Select A, B, C, 3 как O из таблицы, где поле, подобное «%Query%») Порядок по пределу 5 ASC 5

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

я не понимаю

GROUP BY B ORDER BY B ASC LIMIT 5

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

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

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

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

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

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

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

Я не понимаю, зачем нужно объединение для получения данных из одной таблицы. 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top