MYSQL总和基于另一个表

时间:2017-05-29 06:01:53

标签: mysql join sum

假设我有这两个表,

表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 但我认为它适用于我的问题,

2 个答案:

答案 0 :(得分: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;

备注:

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

<强>输出:

enter image description here

在这里演示:

Rextester

答案 1 :(得分:0)

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

尝试以上代码。

希望这会有所帮助。