1

「ギャラリー」のテーブルと「画像」のテーブルが 1 つあります。ギャラリー テーブルは次のようになります。

gal_id|name

そして画像は

img_id|gal_id|name

今、私は20個のギャラリーを持っており、各ギャラリーの画像の総数を表示したいので、1つのクエリを使用して、各ギャラリーの合計画像の配列を次のように返します

Gallery A (Total Images : 23)
Gallery B (Total Images : 33)
Gallery C (Total Images : 523)
Gallery D (Total Images : 25)

これを行うための最良の方法は何ですか。クエリをループに入れたくないので、サーバーに負荷がかかります。アドバイスしてください..

ありがとう

4

2 に答える 2

3

次のように使用COUNTします。GROUP BY

SELECT g.name 'Gallery Name', COUNT(i.img_id) 'Total Images'
FROM galleries g
INNER JOIN images i ON g.gal_id = i.gal_id
GROUP BY g.name

SQL フィドルのデモ

于 2012-11-06T19:10:56.907 に答える
2

これはgallery でグループ化された初歩的な集合体COUNT()nameです。

重要なことに、これは a を使用して、LEFT JOIN画像を持たないギャラリーが行をまったく返さないのではなくゼロ カウントを返すようにする必要があります。

SELECT
  galleries.name,
  COUNT(images.img_id) AS total_images
FROM 
  galleries
  /* LEFT JOIN will ensure empty galleries are listed */
  LEFT JOIN images  ON galleries.gal_id = images.gal_id
GROUP BY galleries.name
/* Sort by descending total_images */
ORDER BY total_images DESC

コメント後に更新

SELECT
  galleries.name,
  COUNT(images.img_id) AS total_images,
  /* Differentiate between downloadable/not downloadable with a SUM(CASE) */
  /* It converts each into a zero or one and then sums up the values */
  SUM(CASE WHEN downloadable = 'Y' THEN 1 ELSE 0 END) AS downloadable,
  SUM(CASE WHEN downloadable = 'N' THEN 1 ELSE 0 END) AS not_downloadable
FROM 
  galleries
  /* LEFT JOIN will ensure empty galleries are listed */
  LEFT JOIN images  ON galleries.gal_id = images.gal_id
GROUP BY galleries.name
/* Sort by descending total_images */
ORDER BY total_images DESC
于 2012-11-06T19:11:38.370 に答える