以下查询执行我想要的操作。它返回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";
谁能看到我做错了什么?提前感谢任何建议。
非常感谢。
答案 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是一个聚合函数,当与其他列一起选中时,要求您按选择列表中的其他列对结果进行分组。
您应该使用要从用户和详细信息中选择的列重写查询,并按这些列进行分组。