【问题标题】:MYSQL sum based on another tableMYSQL求和基于另一张表
【发布时间】:2017-05-29 06:01:52
【问题描述】:

假设我有这两张表,

表A

+----------+---------------------------------+
| product  | categories                      |
+----------+---------------------------------+
| vegetable| carrots, cabbage, string beans  |
+----------+---------------------------------+
| fruit    | apple, oranges                  |
+----------+---------------------------------+

表 B

+--------------+----+
|category      |sale|
+--------------+----+
| carrots      | 10 |
+--------------+----+
| cabbage      | 5  |
+--------------+----+
| apple        | 11 |
+--------------+----+
| string beans | 5  |
+--------------+----+
| oranges      | 7  |
+--------------+----+

我的目标是获得每种产品的总销售额。

+----------+----+
| product  |sale|
+----------+----+
| vegetable| 20 |
+----------+----+
| fruit    | 18 |
+----------+----+

我认为它类似于 this 但我认为它对我的问题的适用不同,

【问题讨论】:

  • 规范化表格tableA

标签: mysql join sum


【解决方案1】:

如前所述,您应该避免将库存作为 CSV 数据存储在表格中。如果必须继续,可以尝试使用 MySQL 的 FIND_IN_SET() 函数加入。此函数可以在 CSV 字符串中搜索特定术语,如果找到则返回索引,否则返回零。

SELECT
    a.product,
    SUM(b.sale) AS sale
FROM tableA a
INNER JOIN tableB b
    ON FIND_IN_SET(b.category, REPLACE(a.categories, ', ', ',')) > 0
GROUP BY a.product
ORDER BY SUM(b.sale) DESC;

注意事项:

FIND_IN_SET() 不会考虑您在 CSV 字符串中可能包含的任何空格。这也必须匹配。因此,我在匹配之前删除了 CSV 字符串中的空格。当您也有像 string beans 这样的术语本身有空格时,这可能会变得很棘手,因为我们无法进行一揽子替换。

输出:

演示在这里:

Rextester

【讨论】:

  • 在集合中查找,我是新手。谢谢。当我产生一个成功的查询时将接受作为答案
【解决方案2】:
SELECT A.product,SUM(B.SALE) FROM TABLEA A
INNER JOIN TABLEB B ON FIND_IN_SET(B.category, REPLACE(A.categories, ', ', ',')) > 0
GROUP BY A.product

假设类别总是包含单个单词类别。

 SELECT A.product,SUM(B.SALE) FROM TABLEA A
    INNER JOIN TABLEB B ON FIND_IN_SET(B.category, REPLACE(A.categories, ' ', '')) > 0
    GROUP BY A.product

试试上面的代码。

希望这会有所帮助。

【讨论】:

  • 嗨 Sagar,这也是我最初的回答,但存在问题,因为 OP 表中的 CSV 字符串有空格。要让FIND_IN_SET() 正常运行,您要么必须匹配该空格,要么先以某种方式将其删除。
  • @TimBiegeleisen 是的。
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多