MySQL Multiply Count
-
28-10-2019 - |
Pregunta
Tengo una consulta, que pasará a través de una tabla de pedidos y, como una subcResper, también contará el número de filas en otra tabla utilizando una clave extranjera.
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'
Ahora, en la tabla ECOM_ORDER_ITEMS, tiene un campo EOI_QUANTITY. Quiero que la consulta muestre la cantidad de productos para cada pedido, teniendo en cuenta el campo de cantidad.
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'
Sin embargo, cuando intento esto, solo me da el mismo número que antes. Para el orden en el que estoy probando, tiene 2 elementos, uno con cantidad 1, el otro con cantidad como 10 y num_prod regresa como 2 en ambas consultas.
¿Algunas ideas? :)
Solución
Si el valor de eoi.eoi_quantity consta de múltiples valores, 1 y 10, solo uno de ellos será seleccionado y multiplicado por el conteo (*). Entonces obtienes el resultado 1 * 2.
Como cuenta ( *) = 2 para dos elementos, ¿desea el resultado 2 * 1 + 2 * 10? No me parece correcto. Creo que quieres contar la cantidad total sobre todas las órdenes relevantes, entonces, ¿por qué no usar la suma (eoi.eoi_quantity) para obtener 1 + 10 en su lugar? Así tendrías:
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';
Pero esto todavía le dará el mismo valor para cada columna. De hecho, una subconsulta como (seleccione EO.*, ...) dará como resultado un error si devuelve más de una fila.
Es por eso que Johan sugirió que querrías unirte a las tablas. Debe unirse a las tablas para asegurarse de que las filas estén correctamente vinculadas y luego agruparlas por las identificaciones que desea para cada fila. Qué tal si:
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;
Otros consejos
Reescribe la consulta en:
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;
Porque el recuento (*) para cada elemento individual es 1, count(*) * quantity
es lo mismo que sum(quantity)
.