MySQL - UNION сначала выбирает порядок - PullRequest
0 голосов
/ 09 сентября 2018

У меня SQL SELECT с UNION (SELECT...)

SELECT virtuemart_product_id 
FROM #__virtuemart_products 
WHERE product_special = 1
UNION
(SELECT virtuemart_product_id
 FROM #__virtuemart_product_badges
 WHERE badge = 3)

Этот выбор возвращает virtuemart_product_id: 12345,54321,...,789,987 - например, последние идентификаторы из таблиц UNION (#__virtuemart_product_badges).

Мне нужно отсортировать результаты так, чтобы идентификаторы из таблицы UNION были первыми (union_select_virtuemart_product_id и после first_select_virtuemart_product_id). Если я попробую это:

...
UNION
    (SELECT virtuemart_product_id
     FROM #__virtuemart_product_badges AS badge
     WHERE badge = 3)
ORDER BY badge.virtuemart_product_id

результат - ошибка, конечно. Соответственно любой ORDER BY кроме ...ORDER BY virtuemart_product_id заканчивается ошибкой.

возможно ли это вообще?

ТНХ

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Если вы хотите сначала получить результат из таблицы объединения, то сначала выберите эту таблицу, после этой таблицы - другую таблицу. Как это: -

(SELECT virtuemart_product_id
 FROM #__virtuemart_product_badges
 WHERE badge = 3)
UNION
SELECT virtuemart_product_id 
FROM #__virtuemart_products 
WHERE product_special = 1
0 голосов
/ 09 сентября 2018

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

(SELECT virtuemart_product_id, 0 AS dataset
FROM #__virtuemart_products 
WHERE product_special = 1)
UNION
(SELECT virtuemart_product_id, 1 AS dataset
 FROM #__virtuemart_product_badges
 WHERE badge = 3)
ORDER BY dataset DESC, virtuemart_product_id

Редактировать

Поскольку существует требование вернуть только один столбец (virtuemart_product_id), вам нужно будет заключить этот запрос в подзапрос и SELECT virtuemart_product_id из него:

SELECT virtuemart_product_id
FROM ((SELECT virtuemart_product_id, 0 AS dataset
       FROM #__virtuemart_products 
       WHERE product_special = 1)
      UNION
      (SELECT virtuemart_product_id, 1 AS dataset
       FROM #__virtuemart_product_badges
       WHERE badge = 3)
      ORDER BY dataset DESC, virtuemart_product_id) v
0 голосов
/ 09 сентября 2018

Попробуйте просто сделать несколько вложенных запросов:

select * from (YOUR ALL QUERY) AS p order by virtuemart_product_id
...