2008-08-06 4 views
20

Я пробуя следующий запрос:Как объединить все наборы результатов в 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 

Это три запроса слипшиеся, kindasorta. Однако возвращаемый результат возвращает результаты запроса №3 ДО результатов запроса № 1 (нежелательно).

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

ответ

16

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

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

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

6

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

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

:)

/т.пл

1

SELECT DISTINCT а, б, в FROM ( выбрать, B, C, 1 как о из таблицы, где поле, как 'запроса%' СОЕДИНЕНИЕ выбрать , в, С, 2 как о из таблицы, где поле, как «% запроса» СОЕДИНЕНИЕ SELECT, а, в, С, 3 как о из таблицы, где поле, как «% запросов%» ) ЗАКАЗАТЬ на о ASC LIMIT 5

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

Я не понимаю

GROUP BY B ORDER BY B ASC LIMIT 5 

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

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

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

0

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

'UNION' and 'UNION ALL' 

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

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

Смежные вопросы