我需要構建一些相當簡單的SQL,我想,但因爲這是一個罕見的事件,我最近與DB工作,我無法弄清楚細節。SQL:獲取所有文章與任何意見
我有一個表 '崗位' 有以下欄目:
ID,標題,文字
和一張桌子 '意見' 具有以下的列:
id,name,text,post_id
What would t他(單個)SQL語句看起來像是通過'post_id'鍵檢索所有包含一個或多個註釋的註釋的標題?如果DBMS與SQL查詢有任何相關性,那麼它就是MySQL。
我需要構建一些相當簡單的SQL,我想,但因爲這是一個罕見的事件,我最近與DB工作,我無法弄清楚細節。SQL:獲取所有文章與任何意見
我有一個表 '崗位' 有以下欄目:
ID,標題,文字
和一張桌子 '意見' 具有以下的列:
id,name,text,post_id
What would t他(單個)SQL語句看起來像是通過'post_id'鍵檢索所有包含一個或多個註釋的註釋的標題?如果DBMS與SQL查詢有任何相關性,那麼它就是MySQL。
select p.caption, count(c.id) from posts p join comments c on p.id = c.post_id group by p.caption having count (c.id) > 0
你基本上看執行的子查詢 -
SELECT p.caption FROM posts p WHERE (SELECT COUNT(*) FROM comments c WHERE c.post_id=p.id) > 1;
這有運行SELECT COUNT(*)
子查詢的職位表中每一行的效果。根據您的表的大小,可以考慮增加一個額外的列,comment_count
,進入你的posts
表來存儲相應comments
,這樣你可以簡單地做
SELECT p.caption FROM posts p WHERE comment_count > 1
Nooo!絕對不應該爲這種簡單的事情提倡去規範化。 – FlySwat 2008-11-13 22:59:25
正要關上的數我的頭在這裏,但可能的是這樣的:
SELECT caption FROM posts WHERE id IN (SELECT post_id FROM comments HAVING count(*) > 0)
SELECT postscript FROM posts INNER JOIN comments on comments.post_id = posts.id GROUP BY posts.id;
不需要having子句或count()。
編輯:當然應該是一個內聯(爲了避免空值,如果評論是孤兒的話),謝謝jishi。
SELECT DISTINCT caption
FROM posts
INNER JOIN comments ON posts.id = comments.post_id
忘記計數和子查詢。
內部連接會選取所有有效帖子的評論,並排除所有有0評論的帖子。 DISTINCT將合併具有多於1條評論的帖子的重複標題條目。
我覺得這句法是最可讀在這種情況下:
SELECT * FROM posts P
WHERE EXISTS (SELECT * FROM Comments WHERE post_id = P.id)
它表達你的意圖比大多數其他人在這個線程更好 - 「給我所有的職位...」(選擇*來自帖子)「...有任何評論」(如果存在(選擇*從評論...))。它基本上與上面的連接相同,但是因爲您實際上並沒有進行連接,所以您不必擔心在Posts中獲取記錄的重複內容,因此每個文章只會獲得一條記錄。
HAVING和COUNT是unnessesacry,因爲他想要任何有1或更多評論的東西。並且爲了清晰起見使用INNER JOIN,即使內部連接是默認連接。 – jishi 2008-11-13 23:02:52
和GROUP BY p.id,因爲那可能是主鍵。 – jishi 2008-11-13 23:03:35
它應該是「...> 0」而不是「...> 1」,除了它看起來不錯:) – 2008-11-13 23:08:39