1

背景:「画像」は1つの「写真撮影」の一部であり、0個または多数の「ギャラリー」の一部である可能性があります。私のテーブル:

「シュート」テーブル:

+----+--------------+
| id | name         |
+----+--------------+
|  1 | Test shoot   |
|  2 | Another test |
|  3 | Final test   |
+----+--------------+

「画像」テーブル:

+----+-------------------+------------------+
| id | original_filename | storage_location |
+----+-------------------+------------------+
|  1 | test.jpg          | store/test.jpg   |
|  2 | test.jpg          | store/test.jpg   |
|  3 | test.jpg          | store/test.jpg   |
+----+-------------------+------------------+

'shoot_images'テーブル:

+----------+----------+
| shoot_id | image_id |
+----------+----------+
|        1 |        1 |
|        1 |        2 |
|        3 |        3 |
+----------+----------+

'gallery_images'テーブル:

+------------+----------+
| gallery_id | image_id |
+------------+----------+
|        1   |        1 |
|        1   |        2 |
|        2   |        3 |
|        3   |        1 |
|        4   |        1 |
+------------+----------+

私が取り戻したいので、私は言うことができます'この写真撮影では、合計X枚の画像があり、これらの画像はYギャラリーで紹介されています。

+----+--------------+-------------+---------------+
| id | name         | image_count | gallery_count |
+----+--------------+-------------+---------------+
|  3 | Final test   |           1 |             1 |
|  2 | Another test |           0 |             0 |
|  1 | Test shoot   |           2 |             4 |
+----+--------------+-------------+---------------+

私は現在、以下のSQLを試しています。これは正しく機能しているように見えますが、1行しか返されません。なぜこれが起こっているのか理解できません。不思議なことに、以下は「シュート」が空の場合でも行を返します。

SELECT shoots.id,
       shoots.name,
       COUNT(DISTINCT shoot_images.image_id) AS image_count,
       COUNT(DISTINCT gallery_images.gallery_id) AS gallery_count
FROM shoots
LEFT JOIN shoot_images ON shoots.id=shoot_images.shoot_id
LEFT JOIN gallery_images ON shoot_images.image_id=gallery_images.image_id
ORDER BY shoots.id DESC

これを見てくれてありがとう:)

4

2 に答える 2

3

GROUP BY条項がありません:

SELECT
     shoots.id,
     shoots.name,
     COUNT(DISTINCT shoot_images.image_id) AS image_count,
     COUNT(DISTINCT gallery_images.gallery_id) AS gallery_count
FROM shoots
LEFT JOIN shoot_images ON shoots.id=shoot_images.shoot_id
LEFT JOIN gallery_images ON shoot_images.image_id=gallery_images.image_id
GROUP BY 1, 2 -- Added this line
ORDER BY shoots.id DESC

注:SQL標準ではGROUP BY、列名または列番号のいずれかを指定できるため、この場合GROUP BY 1, 2と同等です。GROUP BY shoots.id, shoots.nameこの「悪いコーディング慣行」を考慮し、常に列名を使用することを提唱する人はたくさんいますが、コードがはるかに読みやすく、保守しやすくなり、このサイトの多くのユーザーが生まれる前からSQLを書いています。この構文を使用しても問題が発生することはありません。


参考までに、前に1行を取得し、エラーが発生しなかった理由は、mysqlでは、私が知っている他のデータベースとは異なり、group by集約関数を使用するときに句を省略できるためです。このような場合、mysqlは構文例外をスローする代わりに、非集計列の一意の組み合わせごとに最初の行を返します。

これは、最初はSQLの純粋主義者にとっては忌まわしいように思えるかもしれませんが、非常に便利な場合があります。

于 2012-06-17T14:18:11.787 に答える
1

によってMySQL関数グループを調べる必要があります。

于 2012-06-17T14:15:27.163 に答える