2016-04-13 7 views
0

Je travaille avec trois tables, qui stockent les données de vente avec les éléments et les ajouts utilisés.Vérifiez compte sur la colonne

Sales

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

Sale_Items, où add-ons utilisés sont stockés séparés par des virgules

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

Articles

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

Je veux exécuter une requête pour obtenir un type spécifique de résultat cela me permet également de connaître le nombre d'add ons utilisés

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

Comment faire cela via une requête MySQL?

+1

Démarrer en fixant les données. Cette colonne 'addon_ids' est en train de rompre la conception relationnelle. Ceux-ci devraient être des enregistrements séparés. Une fois qu'ils sont des enregistrements séparés, les compter serait fait avec la fonction 'COUNT()'. – David

+1

C'est un vieux db que je travaille maintenant, me prendrait pour toujours changer la structure maintenant. –

+0

@ lad2025 - mais il n'ajouterait pas les quantités de Paperoni et de maïs vendues. –

Répondre

1

Corriger le chemin:

Normalisez votre schéma. addon_ids ne doit pas stocker de valeurs non atomiques, en particulier lorsque vous souhaitez les utiliser pour les joindre.


Solution:

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; 

LiveDemo

sortie:

╔═════════╦═══════════╦═════╗ 
║ item_id ║ item_name ║ qty ║ 
╠═════════╬═══════════╬═════╣ 
║  1 ║ Pizza  ║ 5 ║ 
║  2 ║ Paperoni ║ 3 ║ 
║  3 ║ Corn  ║ 2 ║ 
║  4 ║ Salami ║ 5 ║ 
╚═════════╩═══════════╩═════╝