J'ai deux tables mysql: Je veux pouvoir sélectionner des propriétés pour un code> basé sur leurs noms et renvoyer Je voulais que le résultat soit p> mais malheureusement cette requête renvoie une Ensemble de résultats, car je pense que tel un Comment puis-je écrire une requête pour faire ce que je veux? (Et de préférence sans utiliser code> de rejoindre explicite code> s, mais des virgules et null < / code> si une telle propriété n'existe pas. Voici ce que j'ai essayé: p> p3 code> n'existe pas. p> où code> conditions, car il s'agit d'une requête SQL générée par programme.) Merci pour toute suggestion. P> < / p>
3 Réponses :
Vous devez déplacer le où code> conditions sur p1 code>, p2 code> et p3 code> dans leur Joindre des conditions CODE>, sinon elle transforme ces rejoindre gauche code> s dans Joindre interne code> s (voir le Manuel ).
Accepter cela comme la réponse que c'est la réponse la plus directe à ma question. Les autres réponses sont utiles aussi!
et de préférence sans utiliser des jointures gauche explicites, mais des virgules et où les conditions sont plutôt p>
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 code>,rejoindre l'extérieur gauche code>, 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. P>Mon opinion: Ne tenez même pas à les utiliser. P>
Sélectionnez Propriétés pour une chose p> BlockQuote>
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 code> et une autrecode> est sur le pire que je puisse penser. P>L'approche typique pour obtenir des valeurs d'une clé / La table de valeurs est une agrégion conditionnelle: p>
xxx pré> si cette requête est trop lente à cause de trop de propriétés de la table, ajoutez un
où code> clause: p>xxx pré> et fournir un index approprié: p>
xxx pré> au cas où vous n'en avez pas déjà. p>
Si votre version MySQL est ancienne et ne prend pas en charge
any_value code>, vous devriez envisager la mise à niveau. Si vous ne voulez pas faire cela ou que vous ne pouvez pas faire cela, remplacez simplementany_value code> parmin code> oumax code>.) P> < / blockquote>
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 code> / min code> / max code> 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à.
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;
Vous pouvez obtenir une idée de cette question Stackoverflow.com/Questtions/15745042/...