2016-04-13 8 views
0

私は3つのテーブルを扱っています。アドオン使用addがカラムの数を確認してください

販売

sale_id | sale_amount | sale_time 
--------------------------------------- 
    1  | 20   | 2016-04-11 11:43:00 
    2  | 30   | 2016-04-11 11:53:00 

Sale_Itemsは、コンマが、私は結果の特定の種類を取得するクエリを実行したい

sale_item_id | item_id | qty | price | addon_ids 
------------------------------------------------- 
1   | 1  | 2 | 10 | 3,4 
2   | 1  | 3 | 10 | 2,4 

アイテム

item_id | item_name 
---------------------- 
    1  | Pizza 
    2  | Paperoni 
    3  | Corn 
    4  | Salami 

を分離保存されています使用するアドオンの数を知ることもできます

item_id | Item Name | qty_sold 
------------------------------ 
1  | Pizza  | 5 
2  | Paperoni | 3 
3  | Corn  | 2 
4  | Salami | 5 

これはどのようにMySQLクエリから実行できますか?

+1

スタートデータを固定することによって。その 'addon_ids'カラムはリレーショナルデザインを破っています。それらは別々の記録でなければなりません。ひとたび別々のレコードになると、それらのカウントは 'COUNT()'関数で行われます。 – David

+1

これは私が今働いている古いデータベースです。構造を変更するために永遠に私を連れて行くでしょう。 –

+0

@ lad2025 - ただし、PaperoniとCornの販売数量は加算されません。 –

答えて

1

正しい方法:

スキーマを正規化します。 addon_idsは、非原子値を格納しないでください。特に、それらを使用して結合する必要がある場合。


回避策:

SELECT item_id, item_name, SUM(qty) AS qty 
FROM (
    SELECT i.item_id, i.item_name, SUM(qty) AS qty 
    FROM Items i 
    LEFT JOIN Sale_items si 
    ON i.item_id = si.item_id 
    GROUP BY i.item_id, i.item_name 
    UNION ALL 
    SELECT i.item_id, i.item_name, SUM(qty) 
    FROM Items i 
    LEFT JOIN Sale_items si 
    ON FIND_IN_SET(CAST(i.item_id AS VARCHAR(100)), si.addon_ids) > 0 
    GROUP BY i.item_id, i.item_name 
) AS sub 
GROUP BY item_id, item_name; 

​​

出力:

╔═════════╦═══════════╦═════╗ 
║ item_id ║ item_name ║ qty ║ 
╠═════════╬═══════════╬═════╣ 
║  1 ║ Pizza  ║ 5 ║ 
║  2 ║ Paperoni ║ 3 ║ 
║  3 ║ Corn  ║ 2 ║ 
║  4 ║ Salami ║ 5 ║ 
╚═════════╩═══════════╩═════╝ 
関連する問題