@marsdenden

Как правильно построить подзапрос в JOIN с WHERE, в котором будет участвовать поле, находящееся вне этого подзапроса?

Есть три таблицы, в которых имеется поле ean со штрих-кодом карты

params - параметры корзины
discounts - данные по картам
checks - чеки, из которых необходимо вытащить сумму покупок в которых участвовала карта, указанная в корзине

В итоге надо получить одну запись из корзины, которая бы содержала в себе сумму покупок и данные дисконтной карты

А дальше получается так

запрос, который выбирает сумму покупок по заданной дисконтной карте

SELECT
		COALESCE((SELECT sum(summa) FROM `checks` WHERE vozvrat=0 AND ean=d.ean),0)-
		COALESCE((SELECT sum(summa) FROM `checks` WHERE vozvrat=1 AND ean=d.ean),0) as summa, 
		d.name, d.discount
		FROM `discounts` d 
		left join `checks` c on d.ean = c.ean AND d.ean=c.ean WHERE d.ean="ШТРИХКОД" group by c.ean


пример

С ним все нормально, но когда попытался использовать его в качестве подзапроса

SELECT a.*, 
	b.summa, b.name, b.discount 
	FROM  params a 
	LEFT JOIN (
		SELECT
			COALESCE((SELECT sum(summa) FROM `checks` WHERE vozvrat=0 AND ean=d.ean),0)-
			COALESCE((SELECT sum(summa) FROM `checks` WHERE vozvrat=1 AND ean=d.ean),0) as summa, 
			d.name, d.discount
			FROM `discounts` d 
			LEFT JOIN `checks` c ON d.ean = c.ean AND d.ean=c.ean WHERE d.ean=a.ean GROUP BY c.ean
		) b ON b.ean=a.ean
		WHERE a.somefield="somevalue"

получаю ошибку, поскольку (впрочем, логично) парсер не видит в подзапросе поле a.ean из основного запроса
Текст ошибки: #1054 - Неизвестный столбец 'a.ean' в 'where clause'

пример

Как правильно построить такой запрос?
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Или я чего-то не понимаю, или запрос переусложнен.
Зачем подзапрос к checks, если с ним же джойнится таблица?
В любом случае - зачем WHERE, если оно тут же проверяется ON?
А главная тайна - что значит "d.ean = c.ean AND d.ean=c.ean"?

SELECT a.*, 
  b.summa, b.name, b.discount, 
  FROM  params a 
  LEFT JOIN (
    SELECT
      COALESCE( sum( IF( vozvrat = 0, summa, -summa) ), 0) as summa, 
      d.name, d.discount
      FROM `discounts` d 
      LEFT JOIN `checks` c ON d.ean = c.ean GROUP BY c.ean
    ) b ON b.ean=a.ean
    WHERE a.somefield="somevalue"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы