Вопрос

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

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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top