Количество умножений Mysql

#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. Спасибо, ребята 🙂