MySQL - UNION select 先排序

MySQL - UNION select ordering first

我有 SQL SELECTUNION (SELECT...)

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

这个selectreturnsvirtuemart_product_id: 12345,54321,...,789,987 - 例如 last ids 来自 UNION (#__virtuemart_product_badges) tables.

我需要对结果进行排序,以便来自 UNION table 的 ID 位于第一个(union_select_virtuemart_product_idfirst_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 virtuemart_product_id 之外的任何 ORDER BY 都以错误结束。

这可能吗?

感谢

尝试做一些嵌套查询:

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

如果您想要联合 table 的结果,那么首先 select 那个 table 在那个联合之后另一个 table。像这样:-

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

你可以试试这个。它创建一个人工值,指示数据来自哪个 table,然后按该值在 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

编辑

由于要求 return 只有一列 (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