我基本上有三个表格,帖子,图片和postimages(这只包含其他表格的ID,并允许每个帖子中有多个图像,并且如果需要,每个图像可以在多个帖子中重复使用)。
我正在尝试列出所有帖子的标题,以及每个帖子的一个小图片(如果存在的话)
我可以用以下方法完成:
$sql ="SELECT * FROM posts p, images im, postimages pi WHERE
AND pi.post_id = p.id
AND pi.image_id = im.image_id
ORDER BY created_at LIMIT 10";
但显然,如果有多个图像,则记录会显示两次。
我知道我可以用子查询做到这一点,但这看起来非常低效。这周围有更优雅的方式吗?
任何建议都将不胜感激。感谢。
答案 0 :(得分:1)
select
*
from
posts p
left outer join (select post_id, max(image_id) as image_id
from postimages group by post_id) pi on
p.id = pi.post_id
left outer join images im on
pi.image_id = im.image_id
您可以执行子查询,使其只需执行一次,而不是每行执行一次。这样,它就被用作整个表的子查询,然后加入帖子。显然,如果您想拍摄第一张图片,可以MIN(image_id)
。真的,无论你喜欢什么。
编辑:使其成为left outer join
,甚至可以捕获帖子中不存在的那些图像。如果图像碰巧不存在,这将返回null
。
答案 1 :(得分:0)
SELECT p.id,p.title,im.src
FROM posts p
LEFT JOIN postimages pi
ON p.id = pi.post_id
LEFT JOIN images im
ON pi.image_id = im.image_id
GROUP BY p.id
ORDER BY created_at
LIMIT 10
不确定这是否最有效,您必须针对内部查询运行此操作。 据我所知,它仅适用于MySql。