SELECT SUM(case when p.status = 2 then p.value end) as 'val_accepted'
FROM
props AS p
INNER JOIN (p_contents AS pc
INNER JOIN contents AS c ON c.id = pc.library_id)
ON p.id = pc.prop_id
WHERE p.account_id = 3
GROUP BY (pc.library_id)
所以,发生了什么: 有两个p_contents与道具相关联。这两个p_contents具有相同的library_id,指向相应的内容 因此,p.value的SUM是应该的两倍,因为有两个p_contents指向相同的内容
如何不将p.value加倍?
编辑:
我想出了如何使用DISTINCT,但我仍然需要访问内部列......
SELECT c.name as 'library_name',
SUM(case when p.status = 2 then p.value end) as 'val_accepted',
FROM
props AS p
INNER JOIN
(
SELECT DISTINCT(pc.library_id), prop_id
FROM prop_contents AS pc
INNER JOIN
(
SELECT name, visibility, id, updated_at
FROM contents AS c
) as c
ON c.id = pc.library_id
)as pc
ON p.id = pc.prop_id
WHERE p.account_id = 3
GROUP BY (pc.library_id)
现在我收到了错误:
Unknown column 'c.name' in 'field list')
答案 0 :(得分:1)
这是一个解决方案。首先将集合减少到派生表中的不同行,然后将GROUP BY应用于该结果:
SELECT SUM(case when d.status = 2 then d.value end) as 'val_accepted'
FROM (
SELECT DISTINCT p.id, p.status, p.value, pc.library_id
FROM props p
INNER JOIN p_contents AS pc ON p.id = pc.prop_id
INNER JOIN contents AS c ON c.id = pc.library_id
WHERE p.account_id = 3) AS d
GROUP BY d.library_id
您在示例中使用DISTINCT(pc.library_id)
,就像DISTINCT仅适用于括号内的列一样。这是一个普遍的误解。 DISTINCT适用于选择列表的所有列。 DISTINCT不是一个函数;它是一个查询修饰符。