MYSQL总和基于另一个表

Led*_*Led 0 mysql join sum

假设我有这两张桌子,

表A.

+----------+---------------------------------+
| product  | categories                      |
+----------+---------------------------------+
| vegetable| carrots, cabbage, string beans  |
+----------+---------------------------------+
| fruit    | apple, oranges                  |
+----------+---------------------------------+
Run Code Online (Sandbox Code Playgroud)

表B.

+--------------+----+
|category      |sale|
+--------------+----+
| carrots      | 10 |
+--------------+----+
| cabbage      | 5  |
+--------------+----+
| apple        | 11 |
+--------------+----+
| string beans | 5  |
+--------------+----+
| oranges      | 7  |
+--------------+----+
Run Code Online (Sandbox Code Playgroud)

我的目标是获得每件产品的总销售额.

+----------+----+
| product  |sale|
+----------+----+
| vegetable| 20 |
+----------+----+
| fruit    | 18 |
+----------+----+
Run Code Online (Sandbox Code Playgroud)

我认为它与类似, 但我认为它适用于我的问题,

Tim*_*sen 6

如前所述,您应该避免将库存存储为表格中的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;
Run Code Online (Sandbox Code Playgroud)

笔记:

FIND_IN_SET()不考虑CSV字符串中可能包含的任何空格.这也必须匹配.因此,在匹配之前,我删除了CSV字符串中的空格.当你也有像string beans自己有空格的条款时,这可能会变得棘手,因为我们无法进行全面替换.

输出:

在此输入图像描述

在这里演示:

Rextester