限制跨表的结果总数

Limit total number of results across tables

我想获取最近发生的 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

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

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

放在子查询中,然后在主查询中使用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

如果您想在 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。删除重复项会产生开销。

我认为这行得通

(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