0
votes

Renvoie les valeurs de table droite inexistantes comme null

J'ai deux tables mysql: xxx

Je veux pouvoir sélectionner des propriétés pour un basé sur leurs noms et renvoyer null < / code> si une telle propriété n'existe pas. Voici ce que j'ai essayé: xxx

Je voulais que le résultat soit xxx

mais malheureusement cette requête renvoie une Ensemble de résultats, car je pense que tel un p3 n'existe pas.

Comment puis-je écrire une requête pour faire ce que je veux? (Et de préférence sans utiliser de rejoindre explicite s, mais des virgules et conditions, car il s'agit d'une requête SQL générée par programme.) Merci pour toute suggestion. < / p>


1 commentaires

Vous pouvez obtenir une idée de cette question Stackoverflow.com/Questtions/15745042/...


3 Réponses :


3
votes

Vous devez déplacer le conditions sur p1 , p2 et p3 dans leur Joindre des conditions , sinon elle transforme ces rejoindre gauche s dans Joindre interne s (voir le Manuel ). xxx


1 commentaires

Accepter cela comme la réponse que c'est la réponse la plus directe à ma question. Les autres réponses sont utiles aussi!



3
votes

et de préférence sans utiliser des jointures gauche explicites, mais des virgules et où les conditions sont plutôt

Il est considéré comme un mauvais style d'utiliser de vieilles jointures séparées par des virgules. Les jointures séparées par des virgules ont été utilisées avant des jointures explicites ( joint interne , rejoindre l'extérieur gauche , etc.) ont été inventés en 1992. Une raison d'inventer c'était qu'il n'y avait pas de norme Syntaxe pour les jointures extérieures avant. Un autre était que les jointures séparées par des virgules sont sujets aux erreurs et très souvent moins lisibles. Ils n'existent que pour des raisons de compatibilité maintenant.

Mon opinion: Ne tenez même pas à les utiliser.

Sélectionnez Propriétés pour une chose

Vous avez affaire à une table de clé / valeur ici. Ils sont une nuisance de travailler avec. Y a-t-il une raison de votre modèle de données non seulement d'avoir des tables avec des colonnes explicites? Un modèle de données contenant une table choses et une autre est sur le pire que je puisse penser.

L'approche typique pour obtenir des valeurs d'une clé / La table de valeurs est une agrégion conditionnelle: xxx

si cette requête est trop lente à cause de trop de propriétés de la table, ajoutez un clause: xxx

et fournir un index approprié: xxx

au cas où vous n'en avez pas déjà.

Si votre version MySQL est ancienne et ne prend pas en charge any_value , vous devriez envisager la mise à niveau. Si vous ne voulez pas faire cela ou que vous ne pouvez pas faire cela, remplacez simplement any_value par min ou max .) < / blockquote>


3 commentaires

Je suis tout à fait d'accord avec vos commentaires dans cela; Malheureusement, EAV - alors qu'il a sa place - est devenu très répandu comme moyen simple de la conception appropriée de la base de données.


Merci pour vos suggestions. Malheureusement, ce schéma est une décision de conception préexistante que je dois fonder mes solutions. Comment any_value / min / max dans ce cas comparer avec une jointure gauche, en termes de performance?


Je pense que cela ne devrait pas faire beaucoup de différence. Choisissez l'approche que vous préférez. Dans les deux cas, vous devriez avoir l'index mentionné. Les deux colonnes forment probablement la clé primaire de la table quand même, c'est donc plutôt probable que cet indice existe déjà.



1
votes

Vous pouvez utiliser l'agrégation:

SELECT MAX(CASE WHEN p.name = 'name' THEN p.value END) AS name,
       MAX(CASE WHEN p.name = 'age' THEN p.value END) AS age,
       MAX(CASE WHEN p.name = 'foo' THEN p.value END) AS foo
FROM things t LEFT JOIN
     properties p
     ON t.id = p1.thing_id
WHERE t.id = 1
GROUP BY t.id;


0 commentaires