使用左外连接的mysql过滤结果

时间:2010-04-17 23:59:02

标签: mysql database filter left-join

我的疑问:

        SELECT content.*, activity_log.content_id FROM content
        LEFT JOIN activity_log 
        ON content.id = activity_log.content_id 
        AND sess_id = '$sess_id'
        WHERE activity_log.content_id IS NULL
        AND visibility = $visibility
        AND content.reported < ".REPORTED_LIMIT."
        AND content.file_ready = 1
        LIMIT 1

该查询的目的是从内容表中获取未被用户查看的1行(由session_id标识),但它仍返回已查看的内容。怎么了? (我检查了表格,确保content_ids在那里)

注意:我认为这比使用子查询更有效,想法?

1 个答案:

答案 0 :(得分:1)

问题显然在你的JOIN条件下。当您对内部联接结果感兴趣时,您正在使用的优化(将条件应用于基表)是有意义的,但是在外部JOIN的情况下,这将被解读为:查找content和{{1之间的对应关系当内容标识匹配且会话标识匹配时的行,并且当缺少内容标识的日志,或者内容标识不丢失,但会话标识不是时,返回activity_log行的空值一个指定的。它几乎不是你想要的。

您的查询应该如下所示:

activity_log

如果性能不是最佳,您可以考虑在(sess_id,visibility,fileready,reported)上创建复合索引。