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