2010-04-13 15 views
1

Supposons qu'une question comporte plusieurs balises, via une table de jointure appelée taggings. Je Jointure ainsi:SQL: collecte des valeurs de la main droite à partir d'une jointure

SELECT DISTINCT `questions`.id 
FROM `questions` 
LEFT OUTER JOIN `taggings` 
    ON `taggings`.taggable_id = `questions`.id 
LEFT OUTER JOIN `tags` 
    ON `tags`.id = `taggings`.tag_id 

Je veux commander les résultats selon un nom particulier, par exemple « piano », de sorte que le piano est au sommet, puis par tous les autres balises dans l'ordre alphabétique. Actuellement, je suis en utilisant cet ordre article:

ORDER BY (tags.name = 'piano') desc, tags.name 

qui va complètement faux - les premiers résultats mon retour ne sont même pas taggés avec « piano » du tout. Je pense que mon problème est que je dois grouper les noms de balises et faire mon test de commande contre cela: je pense que le faire par rapport à la balise straights.name ne fonctionne pas en raison de la structure de la table de jointure résultante si je fais juste une sélection simple sur la table des étiquettes) mais je ne peux pas obtenir ma tête autour comment la réparer.

reconnaissant pour tout conseil, max

EDIT - réponse à Marcelo re COALESCE Merci beaucoup Marcelo - je n'avais pas vu auparavant. Doit lire l'api plus correctement. Cela aide réellement, mais seulement si je choisis également la clause coalese. Par exemple, ceci:

SELECT DISTINCT `questions`.id 
FROM `questions` 
LEFT OUTER JOIN `taggings` 
    ON `taggings`.taggable_id = `questions`.id 
LEFT OUTER JOIN `tags` 
    ON `tags`.id = `taggings`.tag_id 
ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name 

donne toujours des résultats erronés. Cependant, ceci:

SELECT DISTINCT `questions`.id, COALESCE(tags.name,'') 
FROM `questions` 
LEFT OUTER JOIN `taggings` 
    ON `taggings`.taggable_id = `questions`.id 
LEFT OUTER JOIN `tags` 
    ON `tags`.id = `taggings`.tag_id 
ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name 

renvoie les bons résultats. J'aimerais quand même simplement sélectionner les identifiants des questions. Décidément se rapprocher de toute façon ...

Répondre

2

Peut-être parce que tags.name = 'piano' évalue à NULL lorsque tags.name est NULL. Essayez COALESCE(tags.name, '') = 'piano'.