簡體   English   中英

MySQL計數記錄按天分組在多個表中

[英]Mysql count records grouped by day in multiple tables

我的數據庫中有新聞文章和博客文章。 兩者的主鍵都是在兩個表中唯一的ItemID。

文章在具有以下字段的表中

  • item_id
  • 標題
  • 身體
  • 發布日期

Blogposts表具有以下字段

  • item_id
  • 標題
  • 身體
  • 發布日期

兩個表都有它們唯一的額外字段。

我有第三個表,其中包含有關文章和帖子的元信息。

項目表具有以下字段

  • item_id
  • source_id
  • ...

每個博客文章和文章在items表中都有一條記錄,在其各自的表中都有一條記錄。

我想做的是建立一個查詢,該查詢將計算每天發布的項目數。 我可以使用按date_posted分組的計數對一個表執行此操作,但是如何在一個查詢中合並文章和計數

您可以通過兩種方式做到這一點。
1.將所有內容結合在一起,然后匯總(請參閱Tom H的答案)。
2.匯總每個表,對其進行UNION,然后再次進行匯總。

選項1可能看起來更短,但將意味着您可能無法從根表上的INDEX中受益(因為必須對JOIN對其進行重新排序)。 因此,我將顯示選項2,它是您前進的方向。

SELECT
  date_posted,
  SUM(daily_count) AS daily_count
FROM
  (
   SELECT date_posted, COUNT(*) AS daily_count FROM article   GROUP BY date_posted
   UNION ALL
   SELECT date_posted, COUNT(*) AS daily_count FROM blogposts GROUP BY date_posted
  )
  AS combined
GROUP BY
  date_posted

如果您在每個表上都有一個索引,而date_posted是索引中的第一個字段,則這應該是最快的。 否則,仍將需要對表進行重新排序以進行聚合。

與Dems類似,但稍微簡單一些:

select date_posted, count(*)
from (select date_posted from article union all
      select date_posted from blogposts) v
group by date_posted

我將為此使用不同的表設計,包括類型和子類型。 您的Items表只有一個單列主鍵,而Blog_Posts和Articles表的主鍵是相同的ID,並帶有Items表的外鍵。 這樣可以很容易地做到這一點,並有助於確保數據完整性。

使用您現有的設計,最好的選擇可能是這樣的:

SELECT
    I.item_id,
    I.source_id,
    COALESCE(A.date_posted, B.date_posted) AS date_posted,
    COUNT(*) AS date_count
FROM
    Items I
LEFT OUTER JOIN Articles A ON
    A.item_id = I.item_id AND
    I.source_id = 'A'  -- Or whatever the Articles ID is
LEFT OUTER JOIN Blog_Posts B ON
    B.item_id = I.item_id AND
    I.source_id = 'B'  -- Or whatever the Blog_Posts ID is
GROUP BY
    I.item_id,
    I.source_id,
    COALESCE(A.date_posted, B.date_posted)

您也可以嘗試使用UNION

SELECT
    SQ.item_id,
    SQ.source_id,
    SQ.date_posted,
    COUNT(*) AS date_count
FROM
    (
        SELECT I1.item_id, I1.source_id, A.date_posted
        FROM Items I1
        INNER JOIN Articles A ON A.item_id = I1.item_id
        WHERE I1.source_id = 'A'
        UNION ALL
        SELECT I2.item_id, I2.source_id, B.date_posted
        FROM Items I2
        INNER JOIN Articles B ON B.item_id = I2.item_id
        WHERE I2.source_id = 'B'
    )
select item_id, date_posted from blogposts where /* some conditions */
union all select item_id, date_posted from articles where /* some conditions */

您可能需要將其放入子查詢中,如果需要,在運行group by時將其與其他表連接。 但是最主要的是, union是用於合並來自不同表的數據的運算符。 union all告訴數據庫您不需要它來合並重復的記錄,因為您知道兩個表永遠不會共享item_id,所以它快了一點(可能)。

暫無
暫無

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

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