Sélectionnez une colonne en fonction de l'existence ou non d'une ligne spécifique dans une autre table

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