MySQL JOIN空表只返回一行

时间:2011-09-12 06:24:02

标签: mysql join mysqli

我有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子句应为fId,而不是hPhotoId

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`

1 个答案:

答案 0 :(得分:1)

您不应该按h.PhotoId进行分组。如果您的投票表为空,则此列将一直为NULL。但是当您在投票表上LEFT JOIN时,它会为每个投票创建一行,并为非投票表中的所有行创建重复的详细信息。因此,您可以对另一个表中的任何唯一列进行分组。 f.Id是个不错的选择。所以将你的最后一行改为:

GROUP BY
    `f`.`Id`