J'ai cette requête:MySQL utiliser certaines colonnes, sur la base d'autres colonnes
SELECT COUNT(articles.id) AS count
FROM articles, xml_documents, streams
WHERE articles.xml_document_id = xml_documents.id
AND xml_documents.stream_id = streams.id
AND articles.published_at BETWEEN '2010-01-01' AND '2010-04-01'
AND streams.brand_id = 7
qui utilise juste la equajoin par défaut en spécifiant trois tableaux au format csv dans la clause FROM .. Ce que je dois faire est un groupe cela par une valeur trouvée dans les articles.source (XML brut) .. il pourrait se transformer en ceci:
SELECT COUNT(articles.id) AS count, ExtractValue(articles.source, "/article/media_type") AS media_type
FROM articles, xml_documents, streams
WHERE articles.xml_document_id = xml_documents.id
AND xml_documents.stream_id = streams.id
AND articles.published_at BETWEEN '2010-01-01' AND '2010-04-01'
AND streams.brand_id = 7
GROUP BY media_type
qui fonctionne très bien, le problème est, j'utilise des rails, et l'utilisation de STI pour la table xml_documents . Le articles.source qui est fourni à la méthode ExtractValue sera de plusieurs formats différents .. Donc ce que je dois pouvoir faire est d'utiliser "/ article/media_type" IF xml_documents.type = 'source one' et utilisez "/ article/source" si xml_documents.type = 'source two'
Ceci est juste parce que les deux types de document formatent leur XML différemment, mais je ne veux pas avoir à exécuter plusieurs requêtes pour récupérer cette information ..
ce serait bien si l'on pouvait utiliser un opérateur ternaire, mais je ne pense pas que cela est possible ..
EDIT A ce point, je suis à la recherche à faire une table temporaire, ou simplement en utilisant UNION pour placer plusieurs ensembles de résultats ensemble ..
MySQL prend en charge SQL dynamique via commandes préparées: http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html –
Je ne sais pas comment cela pourrait aider .. – Rabbott