我正在使用三个表,它们存储销售数据以及使用的商品和附加组件。
销售
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 查询执行此操作?
最佳答案
正确方法:
标准化您的架构。 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 ║
╚═════════╩═══════════╩═════╝
关于mysql - 检查列上的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36598403/