假设我有这两个表,
表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
但我认为它适用于我的问题,
答案 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
这样的术语本身有空格时,这可能会变得棘手,因为我们无法进行全面替换。
<强>输出:强>
在这里演示:
答案 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
尝试以上代码。
希望这会有所帮助。