以下是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的变体,它获取分页的总行数。
答案 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
comments
与users
表中匹配$ 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}}