#mysql #count #multiplication
#mysql #количество #умножение
Вопрос:
У меня есть запрос, который будет перебирать таблицу заказов и в качестве подзапроса также будет подсчитывать количество строк в другой таблице с использованием внешнего ключа.
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 в обоих запросах.
Есть идеи? 🙂
Ответ №1:
Если значение eoi.eoi_quantity состоит из нескольких значений, 1 и 10, только одно из них будет выбрано и умножено на COUNT(*). Итак, вы получаете результат 1 * 2.
Поскольку COUNT (*) = 2 для двух элементов, вам нужен результат 2 * 1 2 * 10 ? Мне это не кажется правильным. Я думаю, вы хотите подсчитать общее количество по всем соответствующим заказам, так почему бы не использовать SUM (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;
Ответ №2:
Перепишите запрос в:
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)
.
Комментарии:
1. Я получаю ошибку от COUNT (eoi.*) в запросе, хотя COUNT (*), кажется, работает нормально.
SELECT eo.*, (COUNT(*) * 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 AND eoi.site_id = '1' AND eo_username = 'testuser' GROUP BY eo.eo_id;
Однако вычисление кажется2. Использование многозначного eio_quantity, возможно, является нарушением стандарта ISO, но MySQL все равно предоставит ответ. Он просто выбирает одно из значений и возвращает его. Следовательно, если в одной группе есть два значения (например, 1 и 10), то одно из двух значений, либо 1, либо 10, будет выбрано для отображения в одной строке для этой группы.
3. @Tom, в этом прелесть MySQL :-). Он будет отклонен назад, чтобы дать вам ответ.
4. Как и пользователи stackoverflow. Спасибо, ребята 🙂