【问题标题】:MySQL - UNION select ordering firstMySQL - UNION 先选择排序
【发布时间】:2018-09-09 07:13:18
【问题描述】:

我有 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)

此选择返回 measuremart_product_id: 12345,54321,...,789,987 - 例如最后一个 ID 来自 UNION (#__virtuemart_product_badges) 表。

我需要对结果进行排序,以便 UNION 表中的 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 都以错误结束。

这可能吗?

谢谢

【问题讨论】:

    标签: mysql sql-order-by union


    【解决方案1】:

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

    【讨论】:

    • 是的,但我没有意识到(我很抱歉)该函数的结果必须只有一列 druthmart_product_id :(
    • @LubosBelan 实现这一目标的最简单方法是将查询包装为子查询。查看我的编辑。
    • 是的,也许这对我来说是正确的方式。你非常:)
    【解决方案2】:

    如果您希望首先从联合表中获取结果,则在联合另一个表之后首先选择该表。像这样:-

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

    【讨论】:

    • 来自manual:“UNION 默认会产生一组无序的行”,所以这不起作用。
    • 在 SQL 中工作。但我不知道是否可以在我的代码中使用它而无需批量编辑它。
    • @LubosBelan 虽然这可能在示例中有效,但不能保证有效。请参阅我之前的评论。
    【解决方案3】:

    试着做一些嵌套查询:

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

    【讨论】:

    • 你能告诉我更多关于这个的信息吗?此语法按 ID(asc、desc)对结果进行排序,或者...否?我需要排序结果:union_select_virtuemart_productid, first_select_virtuemart_product_id
    • 对不起,我出去了。这就是尼克在他们的帖子stackoverflow.com/a/52242396/6357312 中描述的(子查询)
    猜你喜欢
    • 2019-01-14
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多