2011-09-12 10 views
1

私は3つのテーブルを持っています:写真、ユーザー、投票。 私は、ユーザー名と投票してすべての写真を取得したい:MySQL JOIN空のテーブルは1行だけ返します

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 | 
--------------------------- 

上記のクエリが何票がないだけ1行、返します。


Photo  | Name | Surname | Votes 
------------------------------------- 
pic1.jpg | User1 | Sur1 | 0 
------------------------------------- 

しかし、私はすべての3つの行を取得したいと思います電子写真):

------------------------------------- 
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つの写真行に対して' 1'であれば、1行だけ戻ってくるでしょう。 –

+0

回答者に感謝しますが、私はGROUP BY句で間違いを犯しました。 –

答えて

1

あなたはh.PhotoIdによってグループ化すべきではありません。あなたのvoteテーブルが空の場合、このカラムはNULLの最下位になります。しかし、投票テーブル上でLEFT JOINを実行すると、投票ごとに1つの行が作成され、非投票テーブルのすべての行について重複した詳細が表示されます。したがって、別のテーブルの一意の列にグループ化することができます。 f.Idは良い選択です。したがって、最後の行を次のように変更してください:

GROUP BY 
    `f`.`Id` 
関連する問題