2012-04-19 2 views
1

Я чувствую, что есть способ сделать это, используя условные случаи или Ifs, но я просто не могу понять это.Условное предложение Where, если Left Join возвращает строки?

Следующий запрос объединяет три таблицы и отлично работает, если все три таблицы возвращают строки. Однако бывают случаи, когда записи существуют в campaign_groups и new_advertisers, но нет в payment_transactions.

В связи с предложением WHERE, гарантирующим, что payment_transactions.transaction_date> = campaign_groups.date_created, строки с нулевыми транзакциями исключены.

Есть ли способ применить предложение WHERE только тогда, когда LEFT JOIN возвращает строки?

SELECT sum(payment_transactions.transaction_amount) as payment, 
      new_advertisers.account_id, 
      new_advertisers.advertiser_id, 
      max(payment_transactions.transaction_date) as last_payment, 
      campaign_groups.id, 
      campaign_groups.date_created, 
      TIMESTAMPDIFF(DAY, max(payment_transactions.transaction_date), NOW()) as days_passed 
     FROM campaign_groups 
     INNER JOIN new_advertisers ON campaign_groups.advertiser_id = new_advertisers.advertiser_id 
     LEFT JOIN payment_transactions ON payment_transactions.account_id = new_advertisers.account_id 
     WHERE payment_transactions.transaction_date >= campaign_groups.date_created 
      AND campaign_groups.weekly_budget_cents > 0 
     ORDER BY days_passed DESC 

ответ

2

Переместить условие в ваше предложение ON:

LEFT JOIN payment_transactions 
    ON payment_transactions.account_id = new_advertisers.account_id 
    AND payment_transactions.transaction_date >= campaign_groups.date_created 
WHERE campaign_groups.weekly_budget_cents > 0 
+0

Так это работает, Сорт. Он работает, если я удаляю агрегированные функции в SELECT (например, SUM, MAX), предположительно потому, что эти поля не могут быть агрегированы, если они не существуют? Я попробовал добавить IFNULL для проверки, но это не помогло. Например. IFNULL (SUM (payment_transactions.transaction_amount), 0) в качестве оплаты, – Zach

+0

@Zach: Ваш запрос выглядит неправильно. Вам не хватает GROUP BY? При использовании агрегатных функций обычно бывает ошибкой включать поля в список SELECT, которые не находятся ни в агрегатной функции, ни в предложении GROUP BY. Фактически, большинство других баз данных немедленно дадут вам ошибку и даже не попытаются выполнить этот запрос. Вы можете настроить MySQL на более строгий, чтобы он также выдавал ошибку для вашего запроса, а не возвращал бесполезные результаты. См. Здесь для получения дополнительной информации: http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html –

+0

Ах, это и сделало трюк. Мне понадобилась дополнительная GROUP BY на new_advertisers.account_id и тест IFNULL() на days_passed (так как это было бы null, если бы не были возвращены транзакции). Спасибо за помощь! – Zach

Смежные вопросы