我有两张画廊系统的桌子:

gallery_cat(
  gallery_cat_id    PK,
  gallery_cat_name
)

gallery(
  gallery_id        PK,
  gallery_cat_id    FK,
  gallery_name,
  gallery_file_name,
  gallery_date
)

我需要编写一个SQL查询,为每个相册从gallery表返回一张图片,为此,我需要为每个相册列出一张图片的相册。
gallery_name | gallery_cat_name| gallery_file_name
-------------+-----------------+------------------
pic1         | Album1          | pic1.jpg

最佳答案

这应该可以做到:

SELECT g2.gallery_name, gc2.gallery_cat_name, g2.gallery_file_name
FROM gallery g2
INNER JOIN gallery_cat gc2 ON (g2.gallery_cat_id = gc2.gallery_cat_id)
WHERE g2.gallery_id IN (
  SELECT g.gallery_id
  FROM gallery g
  GROUP BY g.gallery_cat_id)

说明:
最后是一个子选择
IN (
  SELECT g.gallery_id
  FROM gallery g
  GROUP BY g.gallery_cat_id) <<-- select 1 random g.id per gallery_cat.

在这里,我选择了所有g.id,但是由于group by子句的缘故,它会将结果减少到每个按项分组的一行。即每g.gallery_cat_id一行(或多或少随机选择)。
接下来,我使用联接执行普通选择:
SELECT g2.gallery_name, gc2.gallery_cat_name, g2.gallery_file_name
FROM gallery g2
INNER JOIN gallery_cat gc2 ON (g2.gallery_cat_id = gc2.gallery_cat_id)
WHERE g2.gallery_id IN (

因为我在同一个查询中两次引用同一个表,所以必须使用别名(*)。
我选择所有名称、所有catnames和所有文件名。
但是,在where子句中,我过滤这些内容,以便只显示来自子select的行。
我必须这样做,因为group by将行混合到一个混乱的ow中,如果我直接从中选择,我将从混合在一起的不同行中获取值,这不是一件好事。
通过首先选择我想要的id,然后将整行与那些id匹配,我可以防止这种情况发生。
*(在这种情况下,这种子选择并不是百分之百正确,但请相信我,为表命名总是一个好主意)

关于php - 为每张专辑获取一张图片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7841878/

10-09 18:45