質問
注文テーブルをループするクエリがあり、サブクエリとして、外部キーを使用して別のテーブルの行数もカウントします。
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つは数量1、もう1つは10のアイテム、もう1つは10のアイテム、Num_Prodは両方のクエリで2として戻っています。
何か案は? :)
解決
EOI.EOI_QUANTITYの値が複数の値、1と10で構成されている場合、そのうちの1つのみが選択され、Count(*)を掛けます。したがって、結果は1 * 2を取得しています。
2つのアイテムの場合( *)= 2として、結果2 * 1 + 2 * 10が必要ですか?それは私には正しくないようです。関連するすべての注文にわたって合計数量を数えたいと思っているので、代わりに1 + 10を取得するためにsum(eoi.eoi_quantity)を使用してみませんか?したがって、あなたは持っているでしょう:
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。*、...を選択する)のようなサブクエリは、複数の行を返すとエラーが発生します。
だからこそ、ヨハンはあなたがテーブルに参加したいと提案したのです。行が適切にリンクされていることを確認して、各行に必要なIDでグループ化することを確認する必要があります。どうですか:
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;
他のヒント
クエリを書き換えます。
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;
個々のアイテムのcount(*)は1であるため、 count(*) * quantity
と同じです sum(quantity)
.