【发布时间】:2019-01-20 12:16:17
【问题描述】:
我有 3 个表格,类别/帖子/图库。
需要返回一个按 csort 顺序排序的类别列表,其中包含最新帖子中的第一张 gsort 照片。如果没有照片或帖子,则显示 null。
每个帖子的第一张照片通常是 gsort=1,但是如果这张照片被删除,它需要显示最低的 gsort 值,因为我会显示一个占位符图像。
categories
----------
cid cname curl csort
1 ccc ccc/ 3
2 bbb bbb/ 2
3 aaa aaa/ 1
4 ddd ddd/ 4
posts
-----
pid pname purl cid padded poffon
1 apples apples.html 2 2019-01-02 10:11:12 1
2 orange orange.html 1 2019-01-02 10:12:00 1
3 grape red-grapes.html 1 2019-01-06 10:15:12 1
4 banana bannas.html 2 2019-01-08 10:19:54 0 //Note: this post is hidden
5 kiwi kiwi-fruit.html 3 2019-01-10 10:26:20 1
gallery_photos
--------------
gid pid gsrc gsort
1 1 img01a.jpg 6
2 1 img01b.jpg 2
3 1 img01c.jpg 4
4 3 img03a.jpg 2
5 3 img03b.jpg 1
6 3 img03c.jpg 4
7 3 img03d.jpg 3
8 2 img02a.jpg 1
9 1 img01d.jpg 5
10 1 img01e.jpg 3
预期结果>>>
cid cname curl gsrc
3 aaa aaa/ null //Note: no photos exist for this post
2 bbb bbb/ img02a.jpg //Note: 1 post exists for this category, show gsrc for lowest gsort
1 ccc ccc/ img03b.jpg //Note: 2 posts exist for this category, show gsrc for lowest gsort for the latest post date
4 ddd ddd/ null //Note: no posts exist for this category... a holding page with other content will be shown
这是我目前所获得的查询结果,但它返回的结果太多:
SELECT C.id
, C.name
, GA.medium_path AS gsrc
, GA.gsort
FROM CATEGORIES C
LEFT
JOIN POSTS P
ON C.cid = P.cid
JOIN
( SELECT cid
, MAX(padded) max_date
FROM POSTS
GROUP
BY cid
ORDER
BY padded DESC
) t
ON t.max_date = P.padded
AND C.cid = P.cid
LEFT
JOIN GALLERY GA
ON GA.pid = P.pid
在此先感谢
【问题讨论】:
-
您使用的是哪个版本的 MySQL?使用 8.0 可能更容易实现这一点。
-
@GMB 它的 v5.5.52,由于其他资源需要这样做,因此实际上不是更改 MySQL 版本的选项。
-
这些答案之一是否解决了您的问题?如果没有,您能否提供更多信息来帮助回答?否则,请考虑将最能解决您的问题的答案标记为已接受(上/下投票箭头下的复选标记)。见stackoverflow.com/help/someone-answers
标签: mysql sql subquery inner-join