MySQL多表SELECT

时间:2012-03-01 17:06:29

标签: php mysql sql

我有三张桌子:

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')

我相信我们可以更优化的方式做到这一点。我知道如何使用相应的用户名获取Link,但是当我需要计算注释时我就陷入困境。

3 个答案:

答案 0 :(得分: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的链接记录。

答案 1 :(得分: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`

答案 2 :(得分: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