我想对 3 个表进行查询,这将给我一个如下所示的结果:
我已经USERID
,根据这一点,我想从下表中获取数据:
ANSTABLE
ID | ANS | USERID | QUERYID
1 | 123 | 1 | 15
2 | 22 | 0 | 16
3 | 17 | 1 | 10
来自ANSTABLE的ID在ANSVOTABLE中与ANSID映射
ANSVOTABLE
USERID | QUERYID | ANSID | UPVOTE | DOWNVOTE
3 | 15 | 1 | 1 | 0
8 | 15 | 1 | 0 | -1
7 | 15 | 1 | 0 | -1
22 | 16 | 2 | 1 | 0
QUERYID ID与"QUERYTABLE"中的 ID 映射
QUERYTABLE
ID | USERID | QUERY | DESCRIPTION
16 | 10 | qwerty | uytrew
15 | 11 | my_data | test_data
10 | 0 | 101010 | 101010
现在我想要一个结果,例如,每当我给 USERID - 0 或 1 等时。 它应该从ANSTABLE
中获取与输入的用户ID相关的所有查询ID 并且根据匹配的查询ID,所有记录都应从表中返回QUERYTABLE
并且还应该为我提供对应于ANSVOTABLE
中的ANSID&&&QUERYIDSUM(UPVOTE)+SUM(DOWNVOTE) as total
。
事实上,我想要如下结果 如果我输入'userID - 1,它应该通过再添加一列来给我
ID | USERID | QUERY | DESCRIPTION | ANSSCORE
15 | 11 | my_data | test_data | -1
10 | 0 | 101010 | 101010 | 0
请注意,ANSSCORE通过计算赞成票和反对票,从ANSVOTABLE
结果中-1
。
还要考虑如果ANSVOTABLE
中不存在相应的 AnsID 和 QueryId,那么在这种情况下,它应该从 Querytable 返回我的记录,其中 o 作为总分
答案将得到认可。
您需要在keys
上join
这 3 张桌子,然后根据需要使用您拥有的任何where clause
进行 2 度或 3 度group by
。
我认为这可能对你有用——
SELECT q.ID, q.QUERY, q.USERID, vote.UPVOTE + vote.DOWNVOTE as totalVote
FROM QUERYTABLE q
JOIN ANSTABLE ans ON ans.QUERYID = q.ID
JOIN ANSVOTABLE vote ON vote.ANSID = ans.ID
WHERE ans.USERID = 2
GROUP BY q.ID, q.QUERY, q.USERID;
您只需要对两列求和并按所需的其他列进行分组。您已经定义了表关系,因此除非我误解了某些内容,否则这应该相当简单。
create table anstable(
ID number,
ANS number,
USERID number,
QUERYID number);
Insert into anstable values(1, 123, 1, 15);
Insert into anstable values(2, 22, 0, 16);
Insert into anstable values(3, 17, 1, 10);
create table ANSVOTABLE(
USERID number,
QUERYID number,
ANSID number,
UPVOTE number,
DOWNVOTE number);
Insert into ansvotable values(3, 15, 1, 1, 0);
Insert into ansvotable values(8, 15, 1, 0, -1);
Insert into ansvotable values(7, 15, 1, 0, -1);
Insert into ansvotable values(22, 16, 2, 1, 0);
create table QUERYTABLE(
ID number,
USERID number,
QUERY varchar2(50),
DESCRIPTION varchar2(50));
insert into querytable values(16, 10, 'qwerty', 'uytrew');
insert into querytable values(15, 11, 'my_data', 'test_data');
insert into querytable values(10, 0, '101010', '101010');
select a.id, a.userid, a.query, a.description, sum(b.upvote + b.downvote) as ansscore
from querytable a
join ansvotable b on b.queryid = a.id
join anstable c on c.id = b.ansid
where c.userid in (0, 1)
group by a.id, a.userid, a.query, a.description;
结果:
Table created.
1 row(s) inserted.
1 row(s) inserted.
1 row(s) inserted.
Table created.
1 row(s) inserted.
1 row(s) inserted.
1 row(s) inserted.
1 row(s) inserted.
Table created.
1 row(s) inserted.
1 row(s) inserted.
1 row(s) inserted.
Result Set 1
ID USERID QUERY DESCRIPTION ANSSCORE
15 11 my_data test_data -1
16 10 qwerty uytrew 1