基本上,我有两张桌子:
表A
aId|isOne|bId
---+-----+---
1 |1 |2
2 |0 |2
3 |1 |1
表B
bId|one|two
---+---+---
1 |5 |13
2 |3 |11
表A参考表B并指定是否需要one
或two
的数据。我需要做的是对给定bId
的值求和,因此这些表上的查询的预期结果将是:
bId|value
---+-----
2 |14
1 |5
目前,我执行此操作的查询格式如下:
select bId,
coalesce(if(bId = 0, null,
sum(if(isOne = 0,
(select two from tableB where tableB.bId = bId),
(select one from tableB where tableB.bId = bId)))) as value
from (select bId, isOne, one, two from tableA
join tableB on tableA.bId = tableB.bId) as tableRes;
请注意,这是较大查询的一部分,并使用较大的表,其中coalesce和first if语句确实有意义使用。
虽然上面的查询出现错误(
错误代码:1242。子查询返回超过1行)
被认为来自sum()
内的if语句。我尝试应用group by
,因为我认为我需要将bId = 2
值结果组合在一起,但未能合法地放置,或者将其合法地置于查询中并让它实际停止子查询返回多个结果。修复错误的任何方向或帮助都会受到赞赏,也可以很好地知道,如上所述,这是查询的精简版本,所以如果认为问题不是已经显示的更多可以添加,但我对上述版本中的错误非常有信心。
答案 0 :(得分:0)
我只是内部加入2个表并在sum()中使用case语句来对正确的值求和:
select tableA.bId, sum(case when isOne=0 then two when isOne=1 then one else 0 end) as val
from tableA
inner join tableB on tableA.bId = tableB.bId
group by tableA.bId ;
答案 1 :(得分:0)
你不需要这么复杂的结构,只需要在连接中进行总结。
SELECT tableA.bId, SUM(IF(isOne, one, two)) AS value
FROM tableA
JOIN tableB ON tableA.bId = tableB.bId
GROUP BY tableA.bId
答案 2 :(得分:0)
我真的能够通过简单地用指定值bId
替换子查询中的任意tableA.bId
来解决这个问题,对于任何对答案感兴趣的人来说。