我有两张画廊系统的桌子:
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/