假设我有这两个表,
表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
这样本身有空格的术语时,这可能会变得棘手,因为我们无法进行全面替换。
输出:
此处演示:
Rextester
关于MYSQL 根据另一张表求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44235547/