我有两张桌子 在第一个表格中,“商品”,存储商品的价格为:
id price
1 40
2 55
3 70
在第二个表中,“集合”,存储的项目集和项目,包含在集合中,存储为逗号分隔列表:
id items
1 1,2,3
2 2,2,3,3
3 1,2,1,2
我需要得到套装的总价。
SELECT id, (
SELECT SUM(price)
FROM `items` AS i
WHERE i.id IN ( s.items )
) AS total_price
FROM `sets` AS s
但如果在“s.items”中存在重复,则总和是错误的。
P.S。抱歉我的英文。
答案 0 :(得分:0)
"item"
item_id price
1 40
2 55
3 70
"sets"
set_id set_name
1 blah
2 wow
3 awesome
"set_item"
set_item_id set_id item_id
1 1 1
2 1 2
3 1 3
4 2 2
5 2 2
6 2 3
7 2 3
8 3 1
9 3 2
10 3 1
11 3 2
select s.set_id,s.set_name, sum(i.price)
from set_item si
join sets s on si.set_id = s.set_id
join item i on si.item_id = i.item_id
group by si.set_id;
+--------+----------+--------------+
| set_id | set_name | sum(i.price) |
+--------+----------+--------------+
| 1 | blah | 165 |
| 2 | wow | 250 |
| 3 | awesome | 190 |
+--------+----------+--------------+
答案 1 :(得分:0)
我自己解决了问题。 我在SQL中编写了函数。称之为" calcSum",它有一个TEXT参数" list":
BEGIN
DECLARE strLen INT DEFAULT 0;
DECLARE subStrLen INT DEFAULT 0;
DECLARE totalSum INT DEFAULT 0;
DECLARE x INT DEFAULT 0;
IF list IS NULL THEN
SET list = '';
END IF;
traversing:
LOOP
SET strLen = CHAR_LENGTH( list );
SELECT price INTO x FROM items WHERE id = SUBSTRING_INDEX( list, ',', 1 );
SET totalSum = totalSum + x;
SET subStrLen = CHAR_LENGTH( SUBSTRING_INDEX( list, ',', 1 ) ) + 2;
SET list = MID( list, subStrLen, strLen );
IF list = '' THEN
LEAVE traversing;
END IF;
END LOOP traversing;
RETURN totalSum;
END
用新功能重写了查询
SELECT id, calcSum(s.items) AS total_price
FROM `sets` AS s