2014-09-17 2 views
1

У меня есть следующий запрос, который отлично работает, но только если каждый выбор находит строку.Запрос MySQL возвращает значение только в том случае, если существуют строки

Я попытался добавить IFNULL для возврата 0, если строк не было найдено, но я все еще не получаю правильный возврат.

SELECT IFNULL(paid_value,0)-IFNULL(ordered_value,0)+IFNULL(credit_value,0) AS account_balance 
      FROM 
      (
       SELECT customer_id, SUM(order_total) AS ordered_value 
       FROM orders 
       WHERE customer_id = '1' 
       GROUP BY customer_id 
      ) AS orders 
      LEFT JOIN 
      (
       SELECT customer_id, SUM(amount) AS paid_value 
       FROM transactions 
       WHERE customer_id = '1' 
       GROUP BY customer_id 
      ) as payments 
      ON orders.customer_id = payments.customer_id 
      LEFT JOIN 
      (
       SELECT customer_id, SUM(amount) AS credit_value 
       FROM credits 
       WHERE customer_id = '1' 
       GROUP BY customer_id 
      ) as credits 
      ON orders.customer_id = credits.customer_id 

Этот запрос в настоящее время возвращает пустой, он не возвращает NULL или 0.

Когда я бегу

   SELECT customer_id, SUM(order_total) AS ordered_value 
       FROM orders 
       WHERE customer_id = '1' 
       GROUP BY customer_id 

Она также возвращает пустой, не NULL или 0, если нет строки. Чтобы весь запрос работал, каждый из трех отдельных запросов должен иметь в себе строку.

Любые идеи?

+0

Надеюсь, у вас есть таблица для клиента. – AK47

+0

Да, но я не знаю, но это не проблема. – Karl

+0

Я знаю, что это не проблема. Пожалуйста, взгляните на мой ответ. – AK47

ответ

2

Это если потому что ни один из столбцов не имеют набор результатов, поэтому пустой результирующий набор возвращается, если вы хотите, чтобы всегда отображать строку в любом случае вы можете попробовать некоторые трюки, как этот, например:

SELECT IFNULL(SUM(payments.paid_value),0)-IFNULL(SUM(orders .ordered_value),0)+IFNULL(SUM(credits.credit_value),0) AS account_balance 
FROM 
(SELECT 1 AS idx, 0 AS paid_value, 0 AS ordered_value, 0 AS credit_value) a 
LEFT JOIN 
      (
       SELECT 1 AS idx, customer_id, SUM(order_total) AS ordered_value 
       FROM orders 
       WHERE customer_id = '1' 
       GROUP BY customer_id 
      ) AS orders 
      ON a.idx = orders.idx 
      LEFT JOIN 
      (
       SELECT customer_id, SUM(amount) AS paid_value 
       FROM transactions 
       WHERE customer_id = '1' 
       GROUP BY customer_id 
      ) as payments 
      ON orders.customer_id = payments.customer_id 
      LEFT JOIN 
      (
       SELECT customer_id, SUM(amount) AS credit_value 
       FROM credits 
       WHERE customer_id = '1' 
       GROUP BY customer_id 
      ) as credits 
      ON orders.customer_id = credits.customer_id 
      GROUP BY a.idx 

Пример - это доказательство концепции, которое может быть адаптировано даже в других ситуациях, когда вам нужно всегда возвращать строку со значениями по умолчанию, даже без элементов в базовых таблицах.

+0

Я получаю сообщение об ошибке: Столбец «paid_value» в списке полей неоднозначен – Karl

+0

Приятное решение (трюк) друга. – AK47

+0

@Karl В верхнем большинстве выберите a.paid_value ... для всех столбцов. – AK47

0

Если вы хотите событие строки, если данных нет, то предположим, что вы должны либо иметь UNION. Или в этом случае вы можете включить в таблицу клиентов & каждую таблицу на правой стороне, сделайте LEFT JOIN.

Я думаю, что следующий select даст вам IDEA.

SELECT O.customer_id, SUM(O.order_total) AS ordered_value 
       FROM Customers C 
       left join orders O on C.ID =o.customer_id 
       WHERE O.customer_id = '1' 
       GROUP BY O.customer_id 
Смежные вопросы