MySQL使用某些列,基于其他列

时间:2010-04-07 21:23:51

标签: mysql ruby-on-rails xml join

我有这个问题:

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

通过在FROM子句中指定csv格式的三个表来使用默认的equajoin。我需要做的是将其分配在articles.source(raw xml)中找到的值..所以它可以变成这个:

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

工作正常,问题是,我正在使用rails,并使用STI作为xml_documents表。提供给 ExtractValue 方法的 articles.source 将有几种不同的格式。所以我需要做的是使用“/ article / media_type “IF xml_documents.type ='source one'并使用”/ article / source“如果xml_documents.type ='source two'

这只是因为两种文档类型的XML格式不同,但我不想运行多个查询来检索这些信息。

如果可以使用三元运算符会很好,但我不认为这是可能的..

修改 在这一点,我正在寻找一个临时表,或者只是使用UNION将多个结果集放在一起..

2 个答案:

答案 0 :(得分:3)

这样的事情:

SELECT COUNT(articles.id) AS count,
       ExtractValue(articles.source,
           CASE xml_documents.type WHEN 'source one' then '/article/media_type'
                                   WHEN 'source two' then '/article/source'
                                   ELSE 'error'
           END),
FROM ...

<击> 修改 试试这个:

SELECT COUNT(articles.id) AS count,
       CASE xml_documents.type WHEN 'source one' THEN ExtractValue(articles.source, '/article/media_type')
                               WHEN 'source two' THEN ExtractValue(articles.source, '/article/source')
                               ELSE NULL
       END as media_type,
...

答案 1 :(得分:0)

我会支持上一张海报:

SELECT
    COUNT(articles.id) AS count,
    (CASE xml_documents.type
        WHEN 'source one' THEN ExtractValue(articles.source, '/article/media_type')
        WHEN 'source two' then ExtractValue(articles.source, '/article/source')
        ELSE NULL
    END) as media_type,
FROM ...