假设我有这两张桌子,
表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)
我认为它与此类似, 但我认为它适用于我的问题,
如前所述,您应该避免将库存存储为表格中的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自己有空格的条款时,这可能会变得棘手,因为我们无法进行全面替换.
输出:
在这里演示: