我的疑问:
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在那里)
注意:我认为这比使用子查询更有效,想法?
答案 0 :(得分:1)
问题显然在你的JOIN条件下。当您对内部联接结果感兴趣时,您正在使用的优化(将条件应用于基表)是有意义的,但是在外部JOIN的情况下,这将被解读为:查找content
和{{1之间的对应关系当内容标识匹配且会话标识匹配时的行,并且当缺少内容标识的日志,或者内容标识不丢失,但会话标识不是时,返回activity_log
行的空值一个指定的。它几乎不是你想要的。
您的查询应该如下所示:
activity_log
如果性能不是最佳,您可以考虑在(sess_id,visibility,fileready,reported)上创建复合索引。