【问题标题】:Is it possible to output the result of a union of two subqueries in alternating order?是否可以以交替顺序输出两个子查询的联合结果?
【发布时间】:2020-06-05 22:46:29
【问题描述】:

假设我在 UNION 语句中有两个子查询,如下所示:

(
    SELECT * 
    FROM users
    ORDER BY registration_date
) 
UNION ALL
(
    SELECT *
    FROM food
    ORDER BY popularity
)

输出如下:

Bob
Alice
Steve
Mark
...
Sandwich
Pizza
Burger
Fries
...

是否可以以交替方式输出它们,使得输出为:

Bob
Sandwich
Alice
Pizza
Steve
Burger
Mark
Fries
...

每个查询输出是数千个项目。

【问题讨论】:

    标签: mysql sql sql-order-by union window-functions


    【解决方案1】:

    如果您运行的是 MySQL 8.0,您可以使用 row_number()

    (select name, 1 src, row_number() over(order by registration_date) rn from users)
    union all 
    (select name, 2, row_number() over(order by popularity) from food)
    order by rn, src
    

    在每个unioned 子查询中,我们使用row_number() 对记录进行排名,并添加另一个名为src 的列来标识记录来自哪个表。

    那么剩下要做的就是order by 分配的row_number(),使用附加列来交替记录。

    请注意,我修改了您的查询以枚举子查询中selected 的列; select * 通常不是一个好的做法,尤其是 union all,它要求两个数据集具有相同的列数(具有等效的数据类型)。

    【讨论】:

    • 感谢您的回答,但不幸的是使用的是 Mysql 5.7。
    【解决方案2】:

    万一您不使用 MySQL 8+,您仍然可以使用相关计数查询来模拟 ROW_NUMBER

    (
        SELECT 1 AS idx, name,
            (SELECT COUNT(*) FROM users u2 WHERE u2.registration_date < u1.registration_date) rn
        FROM users u1
    )
    UNION ALL
    (
        SELECT 2, name,
            (SELECT COUNT(*) FROM food f2 WHERE f2.popularity < f1.popularity) rn
        FROM food f1
    )
    ORDER BY
        rn,
        idx;
    

    【讨论】:

      【解决方案3】:
      DECLARE @id INT;
      SET @id :=0;
      
      SELECT id,t.* FROM(
      SELECT  u.*,(@id:=@id+1) AS id
      
         FROM users u
          ORDER BY registration_date
      ) 
      UNION ALL
      (
          SELECT f.*,(@id:=@id+2) AS id
      
          FROM food f 
          ORDER BY popularity
      )t
      ORDER BY id;
      

      【讨论】:

        猜你喜欢
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        相关资源
        最近更新 更多