atis2345
@atis2345
PHP developer

Как в одном sql запросе вытянуть продукцию и ее общее количество?

Задача следующая вытянуть товары и их общее количество(В данном случае тех у которых color = green)

У одного товара цен может быть много или вовсе не быть, вытянуть нужно минимальную и только 1!

Сейчас в столбце cnt получается количество цен. Вот тут проблема.

SELECT DISTINCT
	prd.id,
	prd.name,
	ROUND( MIN(prc.price), 2) AS price,
	COUNT(prd.*) as cnt

FROM products prd
LEFT JOIN price prc ON prc.product_id = prd.id

WHERE prd.color = green
GROUP BY prd.id
ORDER BY price DESC


UPD:
Это все нужно для того что бы не посылать отдельный COUNT(*) запрос, а в базе товаров много.
  • Вопрос задан
  • 343 просмотра
Решения вопроса 1
@heartdevil
плыву как воздушный шарик
Привет

Как я понял, у вас общее количество одно для всех продуктов с color = green. Поэтому смысла нет его тянуть в этом же запросе. Тяните его другим запросом.

SELECT  COUNT(prd.id) AS cnt FROM products AS prd WHERE prd.color = green.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
atis2345
@atis2345 Автор вопроса
PHP developer
SELECT DISTINCT
	prod.id,
	prod.name,
	prod.producer_id,
	prod.rating,
	prod.data,
	pr.price,
	pr.valute_id

FROM products prod
	-- в результате тут будет массив.
	-- join будет обьединять не с таблицой, а с массивом !!!
	-- сделал чтобы вытянуть valute_id минимальной цены
	LEFT JOIN (
				SELECT
					ROUND(price, 2) AS price,
					valute_id,
					product_id
				FROM price
				WHERE moderation = 1
				   && type_product = 1
				ORDER BY price
			) pr ON pr.product_id = prod.id

WHERE prod.archive = 0
   && (prod.color_id = 1 || prod.color_id = 43)
   && pr.price >= 2000 && pr.price <= 10000

GROUP BY prod.id
ORDER BY relevant DESC
LIMIT 0, 20
Ответ написан
Комментировать
@nozzy
Symfony, Laravel, SQL
Если я все правильно понял,
в первом запросе нужно заменить
COUNT(prd.*) as cnt
на
COUNT(*) as cnt
и
GROUP BY prd.id
на
GROUP BY prd.id, prd.name

Будет так:

SELECT DISTINCT
prd.id,
prd.name,
ROUND( MIN(prc.price), 2) AS price,
COUNT(*) as cnt

FROM products prd
LEFT JOIN price prc ON prc.product_id = prd.id

WHERE prd.color = green
GROUP BY prd.id, prd.name
ORDER BY price DESC
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы