簡體   English   中英

mysql根據另一個表的計數選擇行

[英]mysql select row based on count of another table

我在一個表中有一個博客帖子表。 在一個單獨的表中,我有圖像記錄,這些圖像存儲在與特定博客文章相關的目錄中。

我該如何編寫查詢以僅選擇至少包含5張照片的博客文章?

BlogPosts表具有“ ID”列。 Photos表的“ PostID”列與BlogPosts的“ ID”列相對應。

$query = "SELECT * FROM BlogPosts WHERE ?"
SELECT * 
FROM BlogPosts 
WHERE ID IN 
    (SELECT PostID FROM photos GROUP BY PostID HAVING count(*) >= 5)

這是一個應返回指定結果集的語句示例。

SELECT b.*
  FROM BlogPosts b
  JOIN (SELECT p.PostID
          FROM photos p
         GROUP BY p.PostID
        HAVING COUNT(1) >= 5
       ) c
    ON c.PostID = b.ID

此查詢使用別名為c的內聯視圖。 內聯視圖從photos表返回一個不同的PostID值列表,在photo表中至少有五行。 然后,它將結果集“聯接”到BlogPosts表,因此它僅返回ID與子查詢中的PostID匹配的行。

注意:在MySQL上,使用內聯視圖的這種形式(通常)比使用IN (subquery)謂詞的性能更好。

注意:請平息所有在視圖中“隱藏”此內容的敦促,僅是為了其他人以后需要稍后閱讀此代碼,並弄清楚查詢在做什么。

要獲取照片中的行,其中每個PostID至少有五行...

從PostID的“照片”組中選擇PostID,count(PostID)作為出現次數

只得到至少五個的那些...

從中選擇PostID(從PostID從“照片”組中選擇PostID,count(PostID)作為出現次數)p其中出現次數> = 5

要獲取對應的博客文章...

從BlogPosts中選擇*,其中ID位於(從中選擇PostID,(從PostID中選擇PostID,count(PostID)作為來自Photos組的事件),其中出現次數> = 5);

或者,實際上-您應該首先創建一個視圖,該視圖僅返回出現次數超過5次的照片中的PostID:

在LeastFive創建視圖,從中選擇PostID(從PostID的Photos組中選擇PostID,count(PostID)作為出現次數)p其中出現次數> = 5

然后,您的查詢看起來更像樣了:

從ID中的BlogPosts中選擇*(從atLeastFive中選擇PostID)

確保您的“照片”表在PostID上具有索引,否則性能最終會受到影響。

暫無
暫無

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

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