mysql - 检查列上的计数

标签 mysql sql

我正在使用三个表,它们存储销售数据以及使用的商品和附加组件。

销售

 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;

LiveDemo

输出:

╔═════════╦═══════════╦═════╗
║ 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/

相关文章:

php - 比较 foreach 和 checkbox 的值

php - 在 mysql 中添加一列,以便根据登录的用户转到特定页面

php mysqli "No database selected"使用类

mysql - 通过计算另一个表的结果来更新表

sql - 无法绑定(bind)多部分标识符

php - Laravel 5.x 如何创建具有外键约束的新用户?

php - PDO-MySQL : Boolean values get converted to 1 or empty string on prepared statement binding

SQL绝对值求和及迭代

sql - MySQL 查询在逗号分隔的字符串中查找值

Sql Joins - 根据 Id 将字段分成两个