ВЫБЕРИТЕ ОБЪЕДИНЕНИЕ и ORDER BY в mysql.. как к?

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

(SELECT * FROM table1
ORDER BY fieldA ASC LIMIT 3
)
UNION
(
SELECT * FROM table1
ORDER BY FieldB DESC
)

Это работает, кроме этого, второй порядок (FIELDB DESC) проигнорирован... Кто-то знает Почему?Спасибо

8
задан stighy 4 July 2010 в 16:09
поделиться

1 ответ

Оператор UNION выполняет подразумеваемую сортировку как часть операции объединения (IIRC, по ключевому столбцу(ам)).

Если вам нужна другая сортировка в результате, вы должны применить ORDER BY к объединенной выборке.

В вашем случае вам нужно каким-то образом отличить первый выбор от второго, чтобы правильно упорядочить объединение. Что-то вроде (не проверено):

(SELECT table1.*, 0 AS TMP_ORDER FROM table1 ORDER BY fieldA ASC LIMIT 3)
UNION
(SELECT table1.*, 1 AS TMP_ORDER FROM table1)
ORDER BY TMP_ORDER ASC, 
CASE WHEN TMP_ORDER = 0 THEN fieldA ELSE 0 END ASC, 
CASE WHEN TMP_ORDER = 1 THEN fieldB ELSE 0 END DESC

Проблема этого подхода в том, что у вас будут дубликаты для трех строк, выбранных как часть первого запроса в UNION (поскольку столбцы не полностью совпадают).

Вы уверены, что не можете использовать два SELECT?

17
ответ дан 5 December 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: