Mysql умножна считать
-
28-10-2019 - |
Вопрос
У меня есть запрос, который будет проходить через таблицу заказов, и в качестве подпрограммы также будет подсчитывать количество строк в другой таблице, используя внешний ключ.
SELECT eo.*, (
SELECT COUNT(*)
FROM ecom_order_items eoi
WHERE eo.eo_id = eoi.eoi_parentid
AND eoi.site_id = '1'
) AS num_prods
FROM ecom_orders eo
WHERE eo.site_id = '1' AND eo_username = 'testuser'
Теперь в таблице ecom_order_items он имеет поле eoi_quantity. Я хочу, чтобы запрос отображал количество продуктов для каждого заказа, принимая во внимание поле количества.
SELECT eo.*, (
SELECT COUNT(*) * eoi.eoi_quantity
FROM ecom_order_items eoi
WHERE eo.eo_id = eoi.eoi_parentid
AND eoi.site_id = '1'
) AS num_prods
FROM ecom_orders eo
WHERE eo.site_id = '1' AND eo_username = 'testuser'
Однако, когда я пробую это, это дает мне тот же номер, что и раньше. Для заказа, по которому я тестирую, он имеет 2 элемента, один с количеством 1, другой с количеством как 10, а num_prod возвращается как 2 по обоим запросам.
Любые идеи? :)
Решение
Если значение eoi.eoi_quantity состоит из нескольких значений, 1 и 10, только один из них будет выбрана и умножена на счет (*). Итак, вы получаете результат 1 * 2.
Как count ( *) = 2 для двух элементов, хотите ли вы результат 2 * 1 + 2 * 10? Это не кажется мне правильным. Я думаю, что вы хотите подсчитать общее количество по всем соответствующим заказам, так почему бы не использовать сумму (eoi.eoi_quantity), чтобы получить 1 + 10? Таким образом, вы бы имели:
SELECT eo.*, (
SELECT SUM(eoi.eoi_quantity)
FROM ecom_order_items eoi
WHERE eo.eo_id = eoi.eoi_parentid AND eoi.site_id = '1'
) AS num_prods
FROM ecom_orders eo
WHERE eo.site_id = '1' AND eo_username = 'testuser';
Но это все еще принесет вам одинаковое значение для каждого столбца. На самом деле, подложка, подобная (выберите EO.*, ...) приведет к ошибке, если вернет более одной строки.
Вот почему Йохан предложил вам присоединиться к таблицам. Вам нужно присоединиться к таблицам, чтобы убедиться, что строки правильно связаны, а затем сгруппировать их по идентификатору, которые вы хотите для каждой строки. Как насчет:
SELECT eo.*, SUM(eoi.eoi_quantity)
FROM ecom_orders eo JOIN ecom_order_items eoi ON eo.eo_id = eoi.eoi_parentid
WHERE eo.site_id = '1'
AND eo_username = 'testuser'
GROUP BY eo.eo_id;
Другие советы
Переписать запрос в:
SELECT eo.*, sum(eoi.eoi_quantity) as sales
FROM ecom_orders eo
INNER JOIN ecom_order_items eoi ON (eo.eo_id = eoi.eoi_parentid)
WHERE eo.site_id = '1' AND eoi.site_id = '1' AND eo_username = 'testuser'
GROUP BY eo.eo_id;
Потому что количество (*) для каждого отдельного элемента составляет 1, count(*) * quantity
такой же как sum(quantity)
.