MySQL использует определенные столбцы, основанные на других столбцах - PullRequest
0 голосов
/ 08 апреля 2010

У меня есть этот запрос:

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

Который просто использует уравнение по умолчанию, указав три таблицы в формате csv в предложении FROM. Что мне нужно сделать, это сгруппировать это по значению, найденному в элементах article.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

, который работает нормально, проблема в том, что я использую рельсы и использую STI для таблицы xml_documents. article.source , предоставленный методу ExtractValue , будет иметь несколько различных форматов. Поэтому мне нужно иметь возможность использовать "/ article / media_type" IF xml_documents.type = 'source one' и используйте "/ article / source", если xml_documents.type = 'source two'

Это просто потому, что два типа документов по-разному форматируют свои XML, но я не хочу запускать несколько запросов для получения этой информации.

Было бы неплохо, если бы можно было использовать троичный оператор, но я не думаю, что это возможно ..

EDIT На данный момент я рассматриваю создание временной таблицы или просто использование UNION для объединения нескольких наборов результатов ..

Ответы [ 2 ]

3 голосов
/ 08 апреля 2010

Как насчет чего-то вроде этого:

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 ...

РЕДАКТИРОВАТЬ Попробуйте:

0 голосов
/ 08 апреля 2010

Я бы поддержал предыдущий постер:

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 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...