MYSQL 根据另一张表求和

标签 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 但我认为它对我的问题有不同的应用,

最佳答案

如前所述,您应该避免将库存作为 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

关于MYSQL 根据另一张表求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44235547/

相关文章:

mysql - 第一次出现其他字段=值时更新字段?

sql - 具有 5 个表的复杂 SQL 连接

math - Haskell 中的求和符号

java 我如何将负整数读作正整数

python - 如何计算数字列表中的平均数

mysql - 在某些列值之间的mysql表中查找相同的字符串

PHP/MySQL SET var = var - var

mysql - 从 SQL 中的表中选择不同的日期间隔

MySQL - 即使连接为空也检索结果

php - withCount 闭包中的 groupBy (Laravel 5.3.26)