MySQL总和多个重复的行

时间:2014-10-06 10:42:13

标签: mysql sql

我有两张桌子 在第一个表格中,“商品”,存储商品的价格为:

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。抱歉我的英文。

2 个答案:

答案 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