我有三张桌子:
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,但是当我需要计算注释时我就陷入困境。
答案 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