1

我有两张桌子:

大学 (id) 和 users_colleges (user_id, college_id)

我想选择当前用户没有的所有大学 (user_id != @current_user) 按 user_colleges 表中的匹配数排序,即使它是 0。

我正在尝试但没有成功:

SELECT b.id, COUNT(b.id) AS count
FROM (`users_colleges` AS a)
RIGHT JOIN `colleges` AS b ON `b`.`id` = `a`.`college_id`
GROUP BY `b`.`id`
ORDER BY COUNT(b.id) DESC

这是返回所有大学订购的正确方式。问题是计数不匹配的大学返回 1(应该为 0),并且它还返回用户已经拥有的大学。

4

1 回答 1

1

您应该计算外部连接的表中的字段。这意味着当连接失败时它不计算 NULL 值。

SELECT c.id, COUNT(uc.college_id) AS count
FROM colleges AS c
LEFT JOIN users_colleges AS uc
ON c.id = uc.college_id
GROUP BY c.id
ORDER BY COUNT(uc.college_id) DESC

要不返回用户已经拥有的大学,您可以添加 WHERE 子句:

WHERE NOT EXISTS
(
    SELECT *
    FROM users_colleges AS uc2
    WHERE uc2.college_id = c.id
    AND uc2.user_id = '42'
)
于 2012-06-24T00:43:11.530 回答