2014-01-20 38 views
0

我有两个表:加入两个表和group by问题

问题

id | name

回应

id | problem_id | user_id | value

我有下面的语句。

SELECT 
`problems`.name, 
problem_id, 
sum(value) as knowledge, 
COUNT(*) as attempts FROM `responses` 
LEFT JOIN `problems` ON `problems`.id = `responses`.problem_id 
WHERE problem_id IS NOT NULL AND user_id = 4 
GROUP BY problem_id 

它生成一个列表,像这样:

| name  | problem_id | knowledge | attempts | 
| NULL  | 1   | 6   | 6  | 
| NULL  | 2   | 5   | 6  | 
| NULL  | 3   | 4   | 6  | 
| NULL  | 4   | 3   | 5  | 

我失去了一些东西,我将不胜感激,如果有人可以帮助格式:

| name  | problem_id | knowledge | attempts | 
| Problem A | 1   | 6   | 6  | 
| Problem B | 2   | 5   | 6  | 
| Problem C | 3   | 4   | 6  | 
| Problem D | 4   | 3   | 5  | 
+0

请停止以这种方式使用GROUP BY。它不是ANSI标准。 – Kermit

+0

我如何根据ANSI标准定位自己? – youanden

+0

考虑提供适当的DDL和/或sqlfiddle与期望的结果集合 – Strawberry

回答

2

试试这个。

select p.`name`, p.`id`, r.`user_id`, sum(r.`value`) as knowledge 
from 
`responses` r 
join `problems` p on r.`problem_id` = p.`id` 
where 
r.`user_id` = 4 
group by p.`name`, p.`id` 
+0

谢谢你,@彼得彼得罗夫! – youanden

1

可以在没有你选择既不是聚合函数(如SUM或AVG)的东西,也不是GROUP BY的可变部分。

就你而言,名字既不是。

有些DBMS可能会让你这样做(MySQL),但结果是不可预测的。

解决方案:

SELECT 
`problems`.name, 
problem_id, 
sum(value) as knowledge, 
COUNT(*) as attempts FROM `responses` 
LEFT JOIN `problems` ON `problems`.id = `responses`.problem_id 
WHERE problem_id IS NOT NULL AND user_id = 4 
GROUP BY problem_id, problems.name 
+0

这是一个真正的评论 - 虽然公平地说,并没有真正的问题。 – Strawberry

+0

大声笑你是对的,重读我也意识到的问题。 –

+0

那么解决方案是什么? –