私は、製品を扱うバイリンガルなウェブサイトで働いています。MySQL:結合テーブルの複製SUM()
各製品は、sku
とsupplier_id
です。商品を挿入するときに、sku
とsupplier_id
が既に存在する場合は、新しい商品を作成するのではなく、その数量を更新するだけです。
sku
が一致しますが、supplier_id
が異なる場合は、新しい製品を作成します。
ウェブサイトは多言語であるため、翻訳のためのいくつかの表があります。
私が商品を検索するときには、それぞれsku
の1つが表示され、数量が合計されます。
これは、同じsku
を持つ2つの異なる製品があります。私のクエリ
SELECT
products.id, products.sku, products.slug,
SUM(products.quantity) quantity,
suppliers.name supplier_name,
locale.description,
categories.name category_name
FROM products products
LEFT JOIN products_locale locale ON (products.id = locale.product_id AND locale.language_code = 'it')
LEFT JOIN app_suppliers suppliers ON products.supplier_id = suppliers.id
LEFT JOIN app_categories_locale categories ON (products.category_id = categories.category_id AND categories.language_code = 'it')
WHERE products.slug = 'slug'
GROUP BY products.sku
あり、一つは数量5を持ち、もう一方は2
quantity
フィールドは7を返す必要があり、その代わりに9を返します。基本的には、2番目の製品が複製されます。
LEFT JOIN products_locale locale ON (products.id = locale.product_id AND locale.language_code = 'it')
を削除すると問題は解決しますが、そのフィールドが必要です。
さらに奇妙なことは、products_locale
とapp_categories_locale
という2つの変換テーブルを結合しても、products_locale
だけがこの現象を引き起こすことです。
行を複製せずに同じフィールドを取得する方法はありますか?
は
あなたが、およびいくつかのサンプルデータを与える(
products_locale
の内容、products
の内容と、ご希望の結果)を目指しているもの、要約してみてください。 *を選択してグループを削除してみてください。これは、すべての行と、重複している行を明らかにする必要があります。それらを特定すると、クエリを更新するのが簡単になります –何を知りたいですか?グループを削除すると何も変わらず、*を選択すると何も変わりません。私が言ったように、その単一のLEFT JOINが問題です –