Question

J'ai une requête, ce qui fera une boucle à travers une table de commandes, et en tant que sous requête, compterai aussi le nombre de lignes dans une autre table à l'aide d'une clé étrangère.

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'

Maintenant, sur la table ecom_order_items, il a un champ de eoi_quantity. Je veux que la requête pour afficher le nombre de produits pour chaque commande, en tenant compte du champ de la quantité.

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'

Mais quand j'essaie cela, il me donne juste le même nombre qu'auparavant. Pour l'ordre que je teste sur, il dispose de 2 articles, une avec quantité 1, l'autre avec la quantité que 10, et num_prod revient en 2 sur les deux requêtes.

Toutes les idées? :)

Était-ce utile?

La solution

Si la valeur de eoi.eoi_quantity est constitué de plusieurs valeurs, 1 et 10, un seul d'entre eux sera sélectionné et multiplié par COUNT (*). Donc, vous obtenez le résultat 1 * 2.

COUNT (*) = 2 pour deux articles, que vous voulez le résultat 2 * 1 + 2 * 10? Il ne semble pas juste pour moi. Je vous penser voulez compter la quantité totale sur toutes les commandes pertinentes, alors pourquoi ne pas utiliser SUM (eoi.eoi_quantity) pour obtenir 1 + 10 à la place? vous donc avoir:

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';

Mais cela va encore vous obtenir la même valeur pour chaque colonne. En fait, une sous-requête comme (SELECT eo. *, ...) se traduira par une erreur si elle retourne plus d'une ligne.

Voilà pourquoi Johan suggère que vous voulez joindre les tables. Vous devez joindre les tables pour être sûr que les lignes sont correctement liées, puis de les regrouper par l'identifiant que vous voulez est pour chaque ligne. Que diriez-vous:

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;

Autres conseils

Rewrite the query into:

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;

Because the count(*) for each individual item is 1, count(*) * quantity is the same as sum(quantity).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top