La question est similaire à celle-ci Comment écrire une requête MySQL qui renvoie une colonne temporaire contenant des indicateurs pour savoir si un élément lié à cette ligne existe ou pas dans une autre table
Sauf que je dois être plus précis sur les lignes qui existent
J'ai deux tables: 'competitions' et 'competition_ensortinges'
Compétitions:
ID | NAME | TYPE -------------------------------- 1 | Example | example type 2 | Another | example type
Entrées de la compétition
ID | USERID | COMPETITIONID --------------------------------- 1 | 100 | 1 2 | 110 | 1 3 | 110 | 2 4 | 120 | 1
Je veux sélectionner les compétitions mais append une colonne supplémentaire qui spécifie si l'user a participé au concours ou non. Ceci est mon instruction SELECT actuelle
SELECT c.[ID], c.[NAME], c.[TYPE], (CASE WHEN e.ID IS NOT NULL AND e.USERID = @userid THEN 1 ELSE 0 END ) AS 'ENTERED' FROM competitions AS c LEFT OUTER JOIN competition_ensortinges AS e ON e.COMPETITIONID = c.ID
Mon jeu de résultats souhaité en définissant le paramètre @userid
à 110
est-ce
ID | NAME | TYPE | ENTERED ------------------------------------- 1 | Example | example type | 1 2 | Another | example type | 1
Mais à la place je reçois ça
ID | NAME | TYPE | ENTERED ------------------------------------- 1 | Example | example type | 0 1 | Example | example type | 1 1 | Example | example type | 0 2 | Another | example type | 1
Parce qu'il comptabilise les inputs pour tous les ID user
Réparer votre requête
SELECT c.[ID], c.[NAME], c.[TYPE], MAX(CASE WHEN e.ID IS NOT NULL AND e.USERID = @userid THEN 1 ELSE 0 END ) AS 'ENTERED' FROM competitions AS c LEFT OUTER JOIN competition_ensortinges AS e ON e.COMPETITIONID = c.ID GROUP BY c.[ID], c.[NAME], c.[TYPE]
Une alternative est de le réécrire en utilisant EXISTS qui est à peu près le même mais peut être plus facile à comprendre.
BTW, en utilisant des guillemets simples sur le nom de la colonne est obsolète. Utilisez des crochets.
SELECT c.[ID], c.[NAME], c.[TYPE], CASE WHEN EXISTS ( SELECT * FROM competition_ensortinges AS e WHERE e.COMPETITIONID = c.ID AND e.USERID = @userid) THEN 1 ELSE 0 END [ENTERED] FROM competitions AS c