2008-11-13 21 views
1

我需要構建一些相當簡單的SQL,我想,但因爲這是一個罕見的事件,我最近與DB工作,我無法弄清楚細節。SQL:獲取所有文章與任何意見

我有一個表 '崗位' 有以下欄目:

ID,標題,文字

和一張桌子 '意見' 具有以下的列:

id,name,text,post_id

What would t他(單個)SQL語句看起來像是通過'post_id'鍵檢索所有包含一個或多個註釋的註釋的標題?如果DBMS與SQL查詢有任何相關性,那麼它就是MySQL。

回答

7
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
+0

HAVING和COUNT是unnessesacry,因爲他想要任何有1或更多評論的東西。並且爲了清晰起見使用INNER JOIN,即使內部連接是默認連接。 – jishi 2008-11-13 23:02:52

+0

和GROUP BY p.id,因爲那可能是主鍵。 – jishi 2008-11-13 23:03:35

+0

它應該是「...> 0」而不是「...> 1」,除了它看起來不錯:) – 2008-11-13 23:08:39

-2

你基本上看執行的子查詢 -

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

+0

Nooo!絕對不應該爲這種簡單的事情提倡去規範化。 – FlySwat 2008-11-13 22:59:25

-1

正要關上的數我的頭在這裏,但可能的是這樣的:

SELECT caption FROM posts WHERE id IN (SELECT post_id FROM comments HAVING count(*) > 0) 
2
SELECT DISTINCT p.caption, p.id 
    FROM posts p, 
     comments c 
    WHERE c.post_ID = p.ID 

我認爲使用一個連接WO這比使用IN子句或子查詢要快得多。

+0

但你的更好。 – jishi 2008-11-13 23:08:57

+0

我不確定DISTINCT是否會在這裏工作,或者如果我不得不將它嵌套到子查詢中,即SELECT DISTINCT Caption FROM(我的查詢)......但我想我會把它扔到那裏。 – FlySwat 2008-11-13 23:11:28

0

SELECT postscript FROM posts INNER JOIN comments on comments.post_id = posts.id GROUP BY posts.id;

不需要having子句或count()。

編輯:當然應該是一個內聯(爲了避免空值,如果評論是孤兒的話),謝謝jishi。

0
SELECT DISTINCT caption 
FROM posts 
    INNER JOIN comments ON posts.id = comments.post_id 

忘記計數和子查詢。

內部連接會選取所有有效帖子的評論,並排除所有有0評論的帖子。 DISTINCT將合併具有多於1條評論的帖子的重複標題條目。

0

我覺得這句法是最可讀在這種情況下:

SELECT * FROM posts P 
    WHERE EXISTS (SELECT * FROM Comments WHERE post_id = P.id) 

它表達你的意圖比大多數其他人在這個線程更好 - 「給我所有的職位...」(選擇*來自帖子)「...有任何評論」(如果存在(選擇*從評論...))。它基本上與上面的連接相同,但是因爲您實際上並沒有進行連接,所以您不必擔心在Posts中獲取記錄的重複內容,因此每個文章只會獲得一條記錄。