MySQL Bestel queryantwoord op aantal wedstrijden in een andere rij

Ik heb twee tabellen:

colleges (id) en users_colleges (user_id, college_id)

Ik wil alle colleges selecteren die de huidige gebruiker niet (user_id! = @ Current_user) heeft gesorteerd op basis van het aantal overeenkomsten in de user_colleges-tabel, zelfs als deze 0 is.

Wat ik probeer zonder succes:

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

Dit is de terugkeer van alle colleges die op de juiste manier zijn besteld. Het probleem is dat colleges zonder wedstrijden de telling 1 retourneert (moet 0 zijn) en het zijn ook terugkerende colleges die de gebruiker al heeft.

1

1 antwoord

U moet het veld tellen dat zich in de tabel bevindt die extern is samengevoegd. Dit betekent dat het de NULL-waarden niet meet wanneer de join mislukt.

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

Om de colleges die de gebruiker al heeft niet terug te sturen, kun je een WHERE-clausule toevoegen:

WHERE NOT EXISTS
(
    SELECT *
    FROM users_colleges AS uc2
    WHERE uc2.college_id = c.id
    AND uc2.user_id = '42'
)
1
toegevoegd