MYSQL JOIN语法如何加入三个表

时间:2012-09-05 14:44:08

标签: mysql join syntax

以下查询执行我想要的操作。它返回users表中的所有结果,然后如果在详细信息tble中匹配,则返回相关数据

用户

id|username

细节

id|userid|firstname|lastname


$sql = "SELECT u.*, d.*
FROM `users` u
LEFT JOIN `details` d on
u.id = d.userid
ORDER BY $strorder";

然而,当我尝试加入一个我想要做同样事情的附加表时 - 返回users表的所有结果,如果第三个表中有匹配,则返回相关数据(总跟随者这个用户) - 它只返回一条记录。

第3桌

的后续

id|followerid|followedid

$sql = "SELECT u.*, d.*, COUNT(f.id)
FROM `users` u
LEFT JOIN `details` d on
u.id = d.userid
LEFT JOIN `follow` f on
u.id = f.followedid
ORDER BY $strorder";

谁能看到我做错了什么?提前感谢任何建议。

非常感谢。

2 个答案:

答案 0 :(得分:2)

尽量避免*选择字段,将数据分组会更清楚(即使mysql对分组非常宽松)。

如果您具有聚合函数(如COUNT,SUM),则其他“非聚合”请求字段应位于GROUP BY子句中。

Mysql不会强迫你使用GROUP BY所有字段,但是......我认为“尽可能使用ANSI”是一个很好的习惯(当你使用另一个DBMS时很有用)

SELECT u.id, u.username, d.firstname, d.lastname, count(*) as numberfollowers
FROM user u
LEFT JOIN details d on u.id = d.userid
LEFT JOIN follow f on u.id = f.followedid
GROUP BY u.id, u.username, d.firstname, d.lastname --or just GROUP BY u.id with Mysql
ORDER BY count(*) desc

答案 1 :(得分:0)

COUNT是一个聚合函数,当与其他列一起选中时,要求您按选择列表中的其他列对结果进行分组。

您应该使用要从用户和详细信息中选择的列重写查询,并按这些列进行分组。