簡體   English   中英

限制跨表的結果總數

[英]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

這將返回最多 300 條記錄。 然后,我將獲取結果集,按時間戳排序,並獲取前 100 條記錄。 如何在單個 SQL 查詢中執行此操作,其中 SQL 將僅返回結果集中的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM