J'ai besoin de récupérer tous les paramètres par défaut du tableau des paramètres, mais également de saisir le paramètre de caractère s'il existe pour le caractère x.
Mais cette requête ne récupère que les paramètres où le caractère est = 1, pas les paramètres par défaut si l'utilisateur n'a défini personne.
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ù clé 1 et 2 sont les valeurs par défaut lorsque la clé 0 contient la valeur par défaut avec la valeur de caractère.
la source
Vous trouverez peut-être plus facile à comprendre en utilisant une simple sous-requête
La sous-requête est autorisée à renvoyer null, vous n'avez donc pas à vous soucier de JOIN / WHERE dans la requête principale.
Parfois, cela fonctionne plus rapidement dans MySQL, mais comparez-le au formulaire LEFT JOIN pour voir ce qui fonctionne le mieux pour vous.
la source
Le résultat est correct d'après l'instruction SQL. La jointure gauche renvoie toutes les valeurs de la table de droite et uniquement les valeurs correspondantes de la table de gauche.
Les colonnes ID et NAME proviennent du tableau de droite et sont donc renvoyées.
Le score provient du tableau de gauche et 30 est renvoyé, car cette valeur se rapporte au nom "Flow". Les autres noms sont NULL car ils ne concernent pas le nom "Flow".
Le ci-dessous renverrait le résultat que vous attendiez:
Le SQL applique un filtre sur la table de droite.
la source
Pour ce problème, comme pour beaucoup d'autres impliquant des jointures à gauche non triviales, telles que la jointure à gauche sur des tables jointes en interne, je trouve pratique et un peu plus lisible de fractionner la requête avec une
with
clause. Dans votre exemple,la source