mysql从多个表中正确提取数据,没有重复和不正确的数据

时间:2018-11-08 22:57:22

标签: mysql

场景/用例

老师允许他们的学生与其他老师和年级的孩子一起玩游戏,并获得积分。小组由老师组成,孩子们被放入小组中。

因此,老师拥有一个帐户,因此是用户用户具有 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

更新

添加我设想的表结构 enter image description here

1 个答案:

答案 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