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

голоса
19

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

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

Задан 06/08/2008 в 19:47
источник пользователем
На других языках...                            


7 ответов

голоса
14

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

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
Ответил 06/08/2008 в 19:59
источник пользователем

голоса
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
Ответил 06/08/2008 в 19:55
источник пользователем

голоса
2

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

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
Ответил 06/08/2008 в 19:54
источник пользователем

голоса
1

SELECT DISTINCT A, B, C ОТ (SELECT A, B, C, 1 как о из таблицы, где поле, как 'запроса%' СОЮЗ SELECT, А, В, С, 2 как о из таблицы, где поле, как '% запросов' СОЕДИНЕНИЕ ВЫБОР а, в, С, 3 как о из таблицы, где поле, как «% запросов%») ORDER BY ö ASC LIMIT 5

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

Я не понимаю

GROUP BY B ORDER BY B ASC LIMIT 5

Относится ли это только к последней SELECT, в союзе?

Есть ли MySQL фактически позволяет группе колонкой и до сих пор не делают агрегаты на другие столбцы?

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

Ответил 06/08/2008 в 20:41
источник пользователем

голоса
0

Есть два varients объединения.

'UNION' and 'UNION ALL'

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

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

Ответил 17/09/2008 в 17:21
источник пользователем

голоса
0

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

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

:)

/ тр

Ответил 06/08/2008 в 20:19
источник пользователем

голоса
0

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

Ответил 06/08/2008 в 19:54
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more