Php 为每个相册获取一张图片
我有两张用于画廊系统的桌子:Php 为每个相册获取一张图片,php,mysql,sql,Php,Mysql,Sql,我有两张用于画廊系统的桌子: 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_nam
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.
因为我在同一个查询中引用了同一个表两次,所以您必须使用别名(*)。我选择所有名称、所有CATName和所有文件名。
但是,在
where
子句中,我过滤这些内容,以便只显示子选择中的行
我必须这样做,因为group by将行混合成一个混乱的ow,如果我直接从中选择,我将从不同的行中混合得到值,这不是一件好事。通过首先选择我想要的id,然后将整行与这些id匹配,我可以防止这种情况发生
*(在这种情况下,这种子选择并不是100%正确,但请相信我,为表别名总是一个好主意)您可以使用,否则,您将不得不循环出所有相册,并从每个相册中随机选取一张图片,这将降低效率。这将尝试为每个类别ID选择最新的
画廊日期
,并根据画廊类别
SELECT
c.gallery_cat_id,
c.gallery_cat_name,
i.lastimg
FROM
gallery_cat c
LEFT JOIN (
SELECT gallery_cat_id, gallery_filename AS lastimg, MAX(gallery_date)
FROM gallery
GROUP BY gallery_cat_id, gallery_filename
) i ON c.gallery_cat_id = i.gallery_cat_id
@shox使其成为
左连接
。以上编辑。
SELECT
c.gallery_cat_id,
c.gallery_cat_name,
i.lastimg
FROM
gallery_cat c
LEFT JOIN (
SELECT gallery_cat_id, gallery_filename AS lastimg, MAX(gallery_date)
FROM gallery
GROUP BY gallery_cat_id, gallery_filename
) i ON c.gallery_cat_id = i.gallery_cat_id