老师允许他们的学生与其他老师和年级的孩子一起玩游戏,并获得积分。小组由老师组成,孩子们被放入小组中。
因此,老师拥有一个帐户,因此是用户。 用户具有 UserInfo ,并具有与他们相关的孩子。然后,教师(例如用户)选择要放入 PlayerGroup 的孩子。
我有一个db-fiddle,它包含已建立的数据库和查询的刺刺(我知道查询不是很好,抱歉!)。我有能力提取所需的数据,但每个孩子在每个老师的陪同下显示,因此每个孩子被重复3次。我提出的查询仅适用于3个孩子,每个小组最多可以查询5个孩子,因此以后需要更新。
我尝试使用JOIN,GROUP BY的方法,使用IN而不是“ =”,但是即使搜索Google和StackOverflow,我也无法获得所需的输出。
我只想提取特定组的孩子信息和他们的老师信息(例如playergroupid = 200),而不显示重复信息和错误信息。
此代码被快速设置为即将建立的数据库的示例。请不要区分大小写,选择的类型等,因为这些将在实际构建之前进行更新。我只是在查询中寻求帮助。谢谢您的理解。
DB-Fiddle具有已构建的一切,随时可以使用!
https://www.db-fiddle.com/f/n3ZEncyTteSoTVeybSaRbq/0
CREATE TABLE User(
userid int,
username varchar(255),
PRIMARY KEY (userid)
);
CREATE TABLE UserInfo(
userid int,
name varchar(255),
bio varchar(255),
kid1 int,
kid2 int,
kid3 int,
kid4 int,
kid5 int,
PRIMARY KEY (userid),
FOREIGN KEY (userid) REFERENCES User(userid)
);
CREATE TABLE PlayerGroup(
playergroupid int,
createdby int,
teacher1id int,
kid1id int,
teacher2id int,
kid2id int,
teacher3id int,
kid3id int,
PRIMARY KEY (playergroupid),
FOREIGN KEY (createdby) REFERENCES User(userid)
);
CREATE TABLE Kid(
kidid int,
points int,
kidname varchar(255),
kidgrade varchar(255),
teacherid int,
PRIMARY KEY (kidid),
FOREIGN KEY (teacherid) REFERENCES User(userid)
);
现在执行SQL查询
SET @v_groupid = 200;
Select ui.name as "Teacher Name", kid.kidname as "Kid Name", kid.points, kid.kidgrade
FROM (
Select kidname, points, kidgrade
FROM Kid
WHERE kidid=
(
Select kid1id
FROM PlayerGroup
WHERE playergroupid = @v_groupid
)
OR kidid =
(
Select kid2id
FROM PlayerGroup
WHERE playergroupid = @v_groupid
)
OR kidid =
(
Select kid3id
FROM PlayerGroup
WHERE playergroupid = @v_groupid
)
)
as kid,
(
SELECT name
FROM UserInfo
WHERE userid =
(
Select teacher1id
FROM PlayerGroup
WHERE playergroupid = @v_groupid
)
OR userid =
(
Select teacher2id
FROM PlayerGroup
WHERE playergroupid = @v_groupid
)
OR userid =
(
Select teacher3id
FROM PlayerGroup
WHERE playergroupid = @v_groupid
)
)as ui
更新
答案 0 :(得分:2)
您的结构使查询变得困难。创建{p>而不是UserInfo
有5列
CREATE TABLE Class (
userid int,
kidid int,
PRIMARY KEY (userid, kidid)
);
也许class是一个名称,它可能是一个不同的表,但是kidid-> userid关系似乎在各个地方重复了。
与PlayerGroup
相同,它删除了名称列表和一个单独的称为PlayGroupMembers的表来定义成员:
CREATE PlayGroupMembers (
playergroupid int,
userid int,
kidid int,
PRIMARY KEY (playergroupid, userid, kidid)
(这里的kidid的用户ID真的只是类映射吗?还是kid.teacherid?)
然后,结果变得更容易,例如:
SELECT pg.*, ui.*, k.*
FROM PlayGroupMembers pgm
JOIN PlayerGroup pg
ON pgm.playergroupid = pg.playergroupid
JOIN UserInfo ui
ON pgm.userid = ui.userid
JOIN kid k
ON pgm.kidid = k.kidid
WHERE pgm.playergroupid = @v_groupid