2012-03-01 73 views
0

我有三個表:MySQL的多個表的SELECT

Table(attribute1, attribute2...);  
--------------------------------- 
Users(iduser, username)  
Link(idlink, title, userid)  
Comment(idcomment, content, linkid, userid) 

如何選擇: 鏈接標題,相應的評論的用戶名和號碼?

I'm currently doing like this: 
Q1-Select links (SELECT * FROM `links`) 
Q2-Extract usernames from previous query(Q1) - (SELECT username FROM `user` WHERE iduser=Q1.userid 
Q3-Extract number of comments from Q1 by id (SELECT COUNT(*) as comments FROM `comment` WHERE linkid='Q1.idlink') 

我相信我們可以以更優化的方式做到這一點。我知道如何獲得相應的用戶名的鏈接,但當我需要評論評論時,我被卡住了。

回答

4
SELECT iduser, username, Link.title, COUNT(idcomment) 
FROM Users 
LEFT JOIN Link ON (iduser = userid) 
LEFT JOIN Comment ON (linkid = idlink) 
GROUP BY iduser, idlink 

請注意,您的評論表有些設計不好的 - 在「用戶ID」字段是沒有必要的,並且實際上可以導致情況下,你已經有了一個交聯的記錄。例如屬於用戶A的評論可能會鏈接到屬於用戶B的鏈接記錄。

+0

謝謝,這正是我想要的!我該如何構建評論呢?我在選擇評論時稍後從評論中選擇用戶標識。你的意思是我只需要重命名列名? – ewooycom 2012-03-01 17:18:04

+0

取決於您的使用情況。也許你只允許設置一個linkid或userid,所以一個評論只能附加到一個用戶或一個鏈接上,而不能同時添加到兩個。 – 2012-03-01 17:25:25

+0

我想你們都錯過了這裏的觀點。一位用戶對一條鏈接發表評論。 – nnichols 2012-03-01 17:28:41

0
SELECT 
    l.idlink 
    , l.title 
    , l.userid 
    , u.iduser 
    , u.username 
    , c.idcomment 
    , c.content 

FROM Link AS l 
    JOIN Users AS u ON u.iduser=l.userid 
    JOIN Comment AS c ON c.linkid=l.idlink 
+0

他希望組由u.username和每個用戶的評論總和 – 2012-03-01 17:11:32

+0

還是他希望每個鏈接的評論數?這是Q3的建議。 – nnichols 2012-03-01 17:32:42

+0

啊,我的道歉。我清楚地排除了問題3. – 2012-03-01 18:18:42

1

這是一個很好的做法,養成將所需字段放入SELECT和GROUP BY子句的習慣,就是這樣當你不得不使用一個堅持它的RDBMS時,它不會變得如此震撼。

SELECT 
    `l`.`idlink`, 
    `l`.`title`, 
    `u`.`username`, 
    COUNT(`c`,`idcomment`) AS `comment_count` 
FROM `links` `l` 
INNER JOIN `users` `u` 
    ON `l`.`userid` = `u`.`iduser` 
LEFT JOIN `comments` `c` 
    ON `l`.`idlink` = `c`.`linkid` 
GROUP BY 
    `l`.`idlink`, 
    `l`.`title`, 
    `u`.`username` 
+0

「將習慣的字段放入SELECT和GROUP BY子句是一種很好的習慣,這樣當你不得不使用RDBMS時,它不會如此震驚。」 - - 不它不是。沒有RDBMS **要求**將所有組按列分組。你甚至可以根據字段選擇任何一個組,但是隻用'SELECT COUNT(*)' – zerkms 2012-03-01 20:46:46

+0

抱歉。對我而言措辭不佳。我的意思是列列中的列應該在GROUP BY子句中或某種聚合函數中。 – nnichols 2012-03-01 20:53:36

+0

是的,這是很正確的,然後+1 ;-) – zerkms 2012-03-01 20:55:08