1

私は2つのテーブルを持っています:

colleges (id) と users_colleges (user_id, college_id)

現在のユーザーが持っていないすべての大学を選択したい (user_id != @current_user) 0 であっても、user_colleges テーブルの一致数で並べ替えます。

私が成功していないこと:

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 に答える