类似的SQL查询返回不同的结果

时间:2010-12-31 21:08:00

标签: mysql sql

以下是SQL查询:

$sql1 = "SELECT count(thread) AS total 
          FROM comments
          WHERE thread=1
          AND parent_id=0
          ";

$sql2 = "SELECT count(thread) AS total 
          FROM comments, users 
          WHERE thread=1
          AND parent_id=0
          AND users.user_id=comments.user_id 
          ";

$sql3 = "SELECT comments.*, users.username AS username
        FROM comments, users 
        WHERE thread=1
        AND parent_id=0
        AND users.user_id=comments.user_id 
        ORDER BY date
        LIMIT 10, 5
        ";

我的问题是为什么$ sql1和$ sql2会返回两个不同的结果?

$ sql1返回61行

$ sql2返回56行

$ sql2中的第5行仅用于测试,不是必需的,只是$ sql1的变体,它获取分页的总行数。

3 个答案:

答案 0 :(得分:2)

某些评论不属于活跃用户?

执行:

SELECT count(*)
FROM comments
WHERE thread=1
AND parent_id=0
AND NOT EXISTS (SELECT 1 FROM users
                WHERE users.user_id=comments.user_id)

是否返回> 0?

答案 1 :(得分:2)

显然,有些评论是由不再存在的用户创建的。也就是说,在符合线程/父标准的 comments 表中的61行中,56个具有记录在 users 表中的用户ID,5个具有用户ID未记录在用户表中。这表明您需要在引用用户表的 comments 表上添加外键约束(这将需要用户的主键约束表)。

答案 2 :(得分:0)

$sql2被称为“inner join”。正如DVK指出的那样,当另一个表中没有与连接条件匹配的行(users.user_id=comments.user_id)时,内连接不会返回表中的行。在这种情况下comments users commentsusers表中匹配$ sql1中的所有行匹配,users列中的列设置为-- equivalent to $sql2 SELECT count(c.thread) AS total FROM comments AS c INNER JOIN users ON users.user_id=comments.user_id WHERE c.thread=1 AND c.parent_id=0 -- should return same total as $sql1 SELECT count(c.thread) AS total FROM comments LEFT JOIN users AS u ON u.user_id=c.user_id WHERE c.thread=1 AND c.parent_id=0 当{{1}}没有匹配的行时,为NULL。

{{1}}