【问题标题】:Limit total number of results across tables限制跨表的结果总数
【发布时间】:2020-04-15 04:41:03
【问题描述】:

我想获取最近发生的 100 个事件。事件分散在多个表中。这是一个例子:

SELECT * FROM log_items_purchased ORDER BY timestamp DESC LIMIT 100
UNION
SELECT * FROM log_items_fulfilled ORDER BY timestamp DESC LIMIT 100
UNION
SELECT * FROM log_items_shipped ORDER BY timestamp DESC LIMIT 100

这将返回最多 300 条记录。然后,我将获取结果集,按时间戳排序,并获取前 100 条记录。如何在单个 SQL 查询中执行此操作,其中 SQL 只会在结果集中返回 100 条记录。

我意识到可以通过从每个查询中删除 LIMIT 100,然后进行添加 LIMIT 100 的外部查询来做到这一点,但是这些表确实很大,而且效率很低。

【问题讨论】:

    标签: mysql sql union


    【解决方案1】:

    将其放在子查询中,然后在主查询中使用LIMIT 100

    SELECT *
    FROM (
        SELECT * FROM log_items_purchased ORDER BY timestamp DESC LIMIT 100
        UNION
        SELECT * FROM log_items_fulfilled ORDER BY timestamp DESC LIMIT 100
        UNION
        SELECT * FROM log_items_shipped ORDER BY timestamp DESC LIMIT 100
    ) AS x
    ORDER BY timestamp DESC
    LIMIT 100
    

    【讨论】:

      【解决方案2】:

      如果您想在 SQL 中执行此操作,请使用子查询:

      SELECT e.*
      FROM ((SELECT * FROM log_items_purchased ORDER BY timestamp DESC LIMIT 100
            ) UNION ALL
            (SELECT * FROM log_items_fulfilled ORDER BY timestamp DESC LIMIT 100
            ) UNION ALL
            (SELECT * FROM log_items_shipped ORDER BY timestamp DESC LIMIT 100
            )
           ) e
      ORDER BY timestamp DESC
      LIMIT 100;
      

      注意:不要使用UNION。删除重复项会产生开销。

      【讨论】:

      • 谢谢,我一发布就意识到了。一旦允许我会接受
      【解决方案3】:

      我认为这会奏效

      (SELECT * FROM log_items_purchased ORDER BY timestamp DESC LIMIT 100)
      UNION
      (SELECT * FROM log_items_fulfilled ORDER BY timestamp DESC LIMIT 100)
      UNION
      (SELECT * FROM log_items_shipped ORDER BY timestamp DESC LIMIT 100)
      ORDER BY timestamp DESC LIMIT 100
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 2012-11-30
        • 2017-06-21
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        相关资源
        最近更新 更多