我有两个画廊系统表:
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
答案 0 :(得分:2)
这应该可以解决问题:
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
子句会将每个分组的结果减少到1行。即每g.gallery_cat_id
行1行(随机选择或多或少)。
接下来,我使用连接进行正常选择:
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 (
因为我在同一个查询中两次引用同一个表,所以你必须使用别名(*)
我选择所有名称和所有猫咪名称以及所有文件名
但是在where
子句中,我对这些进行过滤,以便只显示子选择中的行。
我有这样做,因为该组将行混合成一个混乱,如果我直接从那个中选择,我将从不同的行中获取值混合在一起,不是一件好事 首先选择我想要的id,然后将完整行与那些id匹配,我就防止这种情况发生。
* (在这种情况下,这种子选择实际上不是100%真实,但相信我总是一个好主意来对表进行别名)
答案 1 :(得分:1)
这会尝试为每个类别ID选择最新的gallery_date
并加入gallery_cat
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
答案 2 :(得分:0)
您可以使用SQL JOINS执行此操作,否则您必须循环播放所有相册并从每个相册中选择一张效率较低的随机图片。