我有3张桌子:照片,用户,投票。 我想用用户名和投票获得所有照片:
SELECT
`f`.`Photo`,
`u`.`Name`,
`u`.`Surname`,
COUNT(`h`.`Id`) AS `Votes`
FROM
`photos` `f`
JOIN
`users` `u`
ON
`f`.`UserId` = `u`.`Id`
LEFT JOIN
`votes` `h`
ON
`f`.`Id` = `h`.`PhotoId`
WHERE
`f`.`Show` = '1'
GROUP BY
`h`.`PhotoId`
数据:
photos:
---------------------------
|Id | Photo | UserId |
---------------------------
|1 | pic1.jpg | 1 |
---------------------------
|2 | pic2.jpg | 2 |
---------------------------
|3 | pic3.jpg | 3 |
---------------------------
users:
---------------------------
|Id | Name | Surname|
---------------------------
|1 | User1 | Sur1 |
---------------------------
|2 | User2 | Sur2 |
---------------------------
|3 | User3 | Sur3 |
---------------------------
votes (is empty):
---------------------------
|Id | PhotoId | Date |
---------------------------
如果没有投票,上面的查询将仅返回一行:
Photo | Name | Surname | Votes
-------------------------------------
pic1.jpg | User1 | Sur1 | 0
-------------------------------------
但是我想得到所有三行(对于所有三张照片):
-------------------------------------
Photo | Name | Surname | Votes
-------------------------------------
pic1.jpg | User1 | Sur1 | 0
-------------------------------------
pic2.jpg | User2 | Sur2 | 0
-------------------------------------
pic3.jpg | User3 | Sur3 | 0
-------------------------------------
已解决:GROUP BY子句应为f
。Id
,而不是h
。PhotoId
:
SELECT
`f`.`Photo`,
`u`.`Name`,
`u`.`Surname`,
COUNT(`h`.`Id`) AS `Votes`
FROM
`photos` `f`
JOIN
`users` `u`
ON
`f`.`UserId` = `u`.`Id`
LEFT JOIN
`votes` `h`
ON
`f`.`Id` = `h`.`PhotoId`
WHERE
`f`.`Show` = '1'
GROUP BY
`f`.`Id`
答案 0 :(得分:1)
您不应该按h.PhotoId
进行分组。如果您的投票表为空,则此列将一直为NULL。但是当您在投票表上LEFT JOIN时,它会为每个投票创建一行,并为非投票表中的所有行创建重复的详细信息。因此,您可以对另一个表中的任何唯一列进行分组。 f.Id
是个不错的选择。所以将你的最后一行改为:
GROUP BY
`f`.`Id`