MySQL JOIN пустая таблица возвращает только одну строку - PullRequest
1 голос
/ 12 сентября 2011

У меня 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`

1 Ответ

1 голос
/ 12 сентября 2011

Вы не должны группироваться по h.PhotoId. Если ваша таблица голосов пуста, этот столбец будет пустым. Но когда вы ЛЕВЫЕ СОЕДИНЯЕТЕСЬ на таблице голосов, она создает одну строку для каждого голоса с дублирующими деталями для всех строк в таблицах без голосов. Таким образом, вы можете группировать по любому уникальному столбцу из другой таблицы. f.Id - хороший выбор. Поэтому измените свою последнюю строку на:

GROUP BY
    `f`.`Id`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...