限制跨表的结果总数
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
我想获取最近发生的 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