SQL - 执行此查询的最有效方法?

时间:2009-07-13 18:11:59

标签: php mysql

我基本上有三个表格,帖子,图片和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";

但显然,如果有多个图像,则记录会显示两次。

我知道我可以用子查询做到这一点,但这看起来非常低效。这周围有更优雅的方式吗?

任何建议都将不胜感激。感谢。

2 个答案:

答案 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。