230 votes

Jointure à gauche avec clause Where

J'ai besoin de récupérer tous les paramètres par défaut de la table des paramètres, mais aussi de saisir le paramètre du caractère s'il existe pour x caractères.

Mais cette requête ne récupère que les paramètres où le caractère est = 1, et non les paramètres par défaut si l'utilisateur n'a rien défini.

SELECT `settings`.*, `character_settings`.`value`
FROM (`settings`)
LEFT JOIN `character_settings` 
ON `character_settings`.`setting_id` = `settings`.`id`
WHERE `character_settings`.`character_id` = '1'  

Je devrais donc avoir besoin de quelque chose comme ça :

array(
    '0' => array('somekey' => 'keyname', 'value' => 'thevalue'),
    '1' => array('somekey2' => 'keyname2'),
    '2' => array('somekey3' => 'keyname3')
)

Où les touches 1 et 2 sont les valeurs par défaut lorsque la touche 0 contient la valeur par défaut avec la valeur du caractère.

1voto

koakande Points 11

La façon dont j'ai finalement compris la réponse du haut est de réaliser (en suivant l'exemple de la Ordre d'exécution de la requête SQL ) que la clause WHERE est appliquée à l'objet a rejoint filtrant ainsi les lignes qui ne satisfont pas la condition WHERE de la table jointe (ou de sortie). Toutefois, en déplaçant la condition WHERE vers la clause ON, vous l'appliquez aux tables individuelles. avant de rejoindre . Cela permet à la jointure gauche de conserver les lignes de la table de gauche même si certaines entrées de colonnes de ces lignes (entrées des tables de droite) ne satisfont pas la condition WHERE.

0 votes

Cela n'apporte pas de réponse à la question. Une fois que vous avez suffisamment de réputation vous pourrez commenter un article ; au lieu de cela, fournir des réponses qui ne nécessitent pas d'éclaircissement de la part de l'auteur de la demande . - De la revue

-1voto

Dan Points 9

Le résultat est correct sur la base de l'instruction SQL. La jointure gauche renvoie toutes les valeurs de la table de droite, et seulement les valeurs correspondantes de la table de gauche.

Les colonnes ID et NAME proviennent de la table de droite, elles sont donc retournées.

Le score provient de la table de gauche, et 30 est retourné, car cette valeur se rapporte au nom "Flow". Les autres noms sont NULL car ils ne se rapportent pas au nom "Flow".

L'exemple ci-dessous renverrait le résultat que vous attendiez :

    SELECT  a.*, b.Score
FROM    @Table1 a
    LEFT JOIN @Table2 b
       ON a.ID = b.T1_ID 
WHERE 1=1
AND a.Name = 'Flow'

Le SQL applique un filtre sur le tableau de droite.

10 votes

La phrase "La jointure gauche renvoie toutes les valeurs de la table de droite" est incorrecte. La jointure gauche renvoie toutes les valeurs de la table GAUCHE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X