以下是我的问题的一些示例上下文,以帮助澄清我在问什么......
架构
Users
- id
- name
Answers
- id
- user_id
- topic_id
- was_correct
Topics
- id
- name
数据
Users
id | name
1 | Gabe
2 | John
Topics
id | name
1 | Math
2 | English
Answers
id | user_id | topic_id | was_correct
1 | 1 | 1 | 0
2 | 1 | 1 | 1
3 | 1 | 2 | 1
4 | 2 | 1 | 0
5 | 2 | 2 | 0
我希望在结果集中拥有一个表,每个用户有一行,每个主题有两列,一个显示主题的正确答案总和,另一个显示总和该主题的错误答案。对于上面的示例数据,此结果集如下所示:
我想要的结果
users.id | users.name | topic_1_correct_sum | topic_1_incorrect_sum | topic_2_correct_sum | topic_2_incorrect_sum
1 | Gabe | 1 | 1 | 1 | 0
2 | John | 0 | 1 | 0 | 1
显然,如果主题表中有更多主题,我希望这个查询为每个存在的主题包含新的correct_sum和incorrect_sums,所以我正在寻找一种方法来编写这个,而不需要将topic_ids硬编码到我的select子句的sum函数。
有没有一种聪明的方法可以用ARel来制造这类东西?
答案 0 :(得分:0)
加布,
您在这里寻找的是交叉表查询。有很多方法可以编写这个,遗憾的是在SQL中它们都不够通用。 AFAIK每个数据库以不同方式处理交叉表。另一种看待它的方式是作为“多维数据集”,通常在OLAP类型的数据库中找到(与OLTP相反)。
它可以在SQL中轻松编写,但可能包含您正在使用的数据库的一些本机函数。你在用什么数据库?
您的答案表看起来需要1,2,3,4,5而不是1,1,1,1,1作为ID ......