2011-09-12 2 views
1

У меня есть 3 стола: фотографии, пользователи, голоса. Я хочу, чтобы получить все фотографии с именами пользователей и голосов:MySQL JOIN пустая таблица возвращает только одну строку

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

Является ли «f.Show» там значительным? –

+1

Чтобы усилить комментарий @ Ray, если 'f.show' является' 1' только для одной строки фотографии, вы получите только одну строку назад. –

+0

Спасибо за ответ, ребята, но я ошибся в предложении GROUP BY. –

ответ

1

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

GROUP BY 
    `f`.`Id` 
Смежные вопросы