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? :)

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top