2010-04-17 62 views
1

我的查询:MySQL的滤波效果外连接

 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 

该查询的目的是为了获得从尚未观看由用户(通过SESSION_ID标识)的内容表1列,但它仍然返回已被查看的内容。哪里不对? (我已经检查了表格,确保content_ids在那里)

注意:我认为这比使用子查询更有效率,思路?

+0

是的,在MySQL(至少5.0和以下)这比使用子查询更有效率。 我不明白为什么查询不起作用。 – Wolph 2010-04-18 00:02:24

+0

当你在WHERE子句中说它必须是NULL时,在SELECT中返回'activity_log.content_id'有什么意义? – 2010-04-18 00:05:10

+0

如果'activity_log.content_id'为空? – Thomas 2010-04-18 00:17:14

回答

1

这个问题显然在您的JOIN条件中。当您对内部连接结果感兴趣时,您正在使用的优化(对基本表应用条件)是有意义的,但是在外部连接的情况下,其内容如下:当内容标识匹配时,查找contentactivity_log行之间的对应关系和会话ID匹配,并且在记录内容标识丢失或内容标识未丢失但会话标识不是指定的那一个时返回空值为activity_log行。这并不是你想要的。

您的查询应该应该是这样的:

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

如果性能是不是最佳的,你可以考虑建立一个综合指数(sess_id,知名度,fileready报道)。