MySQL:Select 每个类别和用户的多项选择测试结果
MySQL: Select results per category and user for a multiple choice test
我有一个包含项目、选项、答案和用户表的多项选择应用程序:
- 一个项目基本上就是一个问题。每个项目属于三个类别之一。类别以字符串形式存储在
category
字段中。
- 每个项目都有几个链接到它的选项。每个选项都有
item_id
和 points
字段。
- 只要用户选择一个选项,就会创建一个答案。它有
user_id
、item_ id
和 option_id
字段。每 item/user 对只有一个答案。
我需要的
我想要一个汇总每个用户结果的查询,每行一个用户。每行应包含三列,其中包含用户在该类别中得分的总和:
Name | Points in Cat1 | Points in Cat2 | Points in Cat3
John | 3 | 1.5 | 2
Jane | 2 | 2 | 1.5
我有什么
我可以输出按用户和类别分组的点 在不同的行:
SELECT
u.id,
u.first_name,
i.category,
sum(o.points)
FROM
answers a,
options o,
items i,
users u
WHERE a.user_id = u.id
AND a.option_id = o.id
AND o.item_id = a.item_id
AND i.id = a.item_id
GROUP BY u.id, i.category;
# Output:
# John Cat1 3
# John Cat2 1.5
# John Cat3 2
# Jane Cat1 2
# etc.
我需要帮助修改第二个代码清单中的查询,以提供相同的数据,但格式与我在第一个代码清单中勾画的格式相同。
使用 case when 表达式
条件聚合
select firstname,
max(case when category='Cat1' then p end) "Points in Cat1"
max(case when category='Cat2' then p end) "Points in Cat2",
max(case when category='Cat3' then p end) "Points in Cat3"
from
(
SELECT
u.id,
u.first_name,
i.category,
sum(o.points) as p
FROM
answers a join users u on a.user_id = u.id join options o on a.option_id = o.id
join items i on i.id = a.item_id
GROUP BY u.id, i.category, u.id,u.first_name
)AA group by firstname
我有一个包含项目、选项、答案和用户表的多项选择应用程序:
- 一个项目基本上就是一个问题。每个项目属于三个类别之一。类别以字符串形式存储在
category
字段中。 - 每个项目都有几个链接到它的选项。每个选项都有
item_id
和points
字段。 - 只要用户选择一个选项,就会创建一个答案。它有
user_id
、item_ id
和option_id
字段。每 item/user 对只有一个答案。
我需要的
我想要一个汇总每个用户结果的查询,每行一个用户。每行应包含三列,其中包含用户在该类别中得分的总和:
Name | Points in Cat1 | Points in Cat2 | Points in Cat3
John | 3 | 1.5 | 2
Jane | 2 | 2 | 1.5
我有什么
我可以输出按用户和类别分组的点 在不同的行:
SELECT
u.id,
u.first_name,
i.category,
sum(o.points)
FROM
answers a,
options o,
items i,
users u
WHERE a.user_id = u.id
AND a.option_id = o.id
AND o.item_id = a.item_id
AND i.id = a.item_id
GROUP BY u.id, i.category;
# Output:
# John Cat1 3
# John Cat2 1.5
# John Cat3 2
# Jane Cat1 2
# etc.
我需要帮助修改第二个代码清单中的查询,以提供相同的数据,但格式与我在第一个代码清单中勾画的格式相同。
使用 case when 表达式
条件聚合select firstname,
max(case when category='Cat1' then p end) "Points in Cat1"
max(case when category='Cat2' then p end) "Points in Cat2",
max(case when category='Cat3' then p end) "Points in Cat3"
from
(
SELECT
u.id,
u.first_name,
i.category,
sum(o.points) as p
FROM
answers a join users u on a.user_id = u.id join options o on a.option_id = o.id
join items i on i.id = a.item_id
GROUP BY u.id, i.category, u.id,u.first_name
)AA group by firstname