2011-01-20 6 views
0

私はMySQLクエリを書くのがうまくないので、このクエリは正常に動作しません。すべての「グループ」を選択し、そのグループの作成者、最後に更新する人、グループ内の画像の数など、グループに保存されているIDでグループの外部情報を取得します。INNER JOINを使用せずにテーブルを結合するにはどうすればよいですか?

このクエリでは、INNER JOINを使用していますが、このクエリではイメージが選択されていないグループは明らかです。私は、クエリーで何があってもすべてのグループを選択し、IDを使ってすべてのグループの情報を取得します。グループに画像がない場合、無視するグループではなく、画像数を0にします。

これは、現在のクエリです:

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, COUNT(i.id) as image_count 

FROM gallery_groups g INNER JOIN 
     users c INNER JOIN 
     users u INNER JOIN 
     gallery_images i 

WHERE g.created_by=c.id AND g.updated_by=u.id AND i.group=g.id $id 
GROUP BY g.name 
ORDER BY g.date_updated DESC, g.name 

私はINNERは、RIGHT JOINとOUTER JOINをLEFT JOINとJOINを交換しようとしているが、すべてはただ、SQLエラーになります。

ありがとうございました!

+0

どのようなエラーが表示されていますか? – zerkms

答えて

3

ジョインにジョインが含まれているジョイン基準を設定します。あなたがグループ化されているので は

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, COUNT(i.id) as image_count 
FROM gallery_groups g LEFT JOIN 
     users c ON g.created_by=c.id LEFT JOIN 
     users u ON g.updated_by=u.id LEFT JOIN 
     gallery_images i ON i.group=g.id 
WHERE g.id = $id 
GROUP BY g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname, g.updated_by, u.fullname 
ORDER BY g.date_updated DESC, g.name 

にMySQLがあなたを可能にしても集計(列の合計値/最大など)と非集計(フィールドない機能でGROUP BYではなく)を混ぜて使用しないでください画像数を除く他のほとんどすべてで、ちょうどあなたがSQLに2つのテーブルを結合するとき

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, 
    IFNULL((
     select COUNT(1) 
     from gallery_images i 
     WHERE i.group=g.id), 0) as image_count 
FROM gallery_groups g LEFT JOIN 
     users c ON g.created_by=c.id LEFT JOIN 
     users u ON g.updated_by=u.id LEFT JOIN 
     gallery_images i ON i.group=g.id 
WHERE g.id = $id 
ORDER BY g.date_updated DESC, g.name 
1

は、あなたが参加する基準を与えていることを副問合せの方が良いかもしれません。

FROM句が最初に実行され、クエリによって返されるすべてのデータが収集されます。次に、返される行数を減らすGROUP BY句とWHERE句が実行されます。最後に、結果セット全体を再編成するORDER BY句が実行されます。

内部結合と外部結合の違いは、不一致が発生した場合の動作です。内部結合は不一致の行を削除し、外部結合は不一致を許容します。ほとんどの場合、外部結合が必要な理由がない限り、内部結合が必要です。

関連する問題