因此在我的项目中,我需要访问一个名为“日期”的表。表“日期”包含以下内容:
ClassID | TeacherID | StudentID | DateInfo | Status | DateID
对于除DateID以外的任何ID,我需要创建一个连接到Dates Model的模型。 另一个重要的信息是,我有一个名为“用户”的表,并且有两个表是从“用户”,“学生”和“老师”派生的。
我的问题:因为我需要学生和老师 相同的记录,我需要从数据库请求用户的信息 关于它们都在同一查询中。我不能因为我 不知道如何定义学生的信息不同于 老师的信息。
用户表:
UserID | Name | LastName | Password | Status | Role
教师表:
TeacherID | ClassID
学生表:
StudentID | YearAndClass
我要创建的查询:
SELECT
IF(Users.Role == 0(Student Role))
Users.Name as sName, ....
ELSE IF(Users.Role == 1(Teacher Role))
Users.Name as tName, ....
FROM Dates, Users, Students, Teachers
我知道这行不通,但是我不确定我还能如何描述它。
谢谢!
答案 0 :(得分:4)
根据我对您的问题的评论,我仍然认为您应该回过头来稍微修改一下结构,您似乎大部分都在那儿,但是最好在使用它之前弄清所有过程的基础。
也就是说,根据我的理解,您希望将用户名列为1个列表,但要根据其角色来区分。以下应该可以。
我在UserID和Role字段中添加了名称,以便您可以根据自己的数据检查它们,以查看其是否按预期工作。
SELECT
CASE WHEN d.Role = 'Teacher Role' THEN ut.UserID
WHEN d.Role = 'Student Role' THEN us.UserID
ELSE ''
END AS UserID
,CASE WHEN d.Role = 'Teacher Role' THEN ut.Name
WHEN d.Role = 'Student Role' THEN us.Name
ELSE ''
END AS UserName
,d.Role
FROM Dates d
LEFT JOIN Users ut ON d.TeacherID = ut.UserID
INNER JOIN Teachers t ON ut.UserID = t.TeacherID
LEFT JOIN Users us ON d.StudentID = us.UserID
INNER JOIN Students s ON us.UserID = s.StudentID
或以下(未试用);
SELECT
CASE WHEN d.Role = 'Teacher Role' THEN ut.UserID
WHEN d.Role = 'Student Role' THEN us.UserID
ELSE ''
END AS UserID
,CASE WHEN d.Role = 'Teacher Role' THEN ut.Name
WHEN d.Role = 'Student Role' THEN us.Name
ELSE ''
END AS UserName
,d.Role
FROM Dates d
LEFT JOIN Users ut ON d.TeacherID = ut.UserID AND ut.UserID IN (SELECT DISTINCT TeacherID FROM Teachers)
LEFT JOIN Users us ON d.StudentID = us.UserID AND us.UserID IN (SELECT DISTINCT StudentID FROM Students)
答案 1 :(得分:0)
正如我所说,我正在做一个项目。我的项目是一个用于管理家长会议在学校的一天的系统。 这些是我的表格,关系等等:
我的目标是在我的API中创建一个“ getAllDates ”函数。
在我的数据库中,“日期”表是存储所有“教师-家长会议”信息的位置。结果,我的Dates表包含了一堆外键, 在我的API代码转换为在日期模式等模式,这里看到的情况:
void showShortBioDialog(BuildContext context) {
showDialog(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return Dialog(
child: Stack(
overflow: Overflow.visible, // 1st change
children: <Widget>[
...
Positioned(
bottom: -35, // 2nd change
right: 0,
left: 0,
child: IconButton(
icon: Image.asset(
"images/next_signup.webp",
height: 35,
width: 35,
fit: BoxFit.contain,
),
onPressed: () {}),
)
],
),
);
});
如您所想,每个实例都有其自己的属性,我需要提供给他的属性。这时候,我的问题开始。
因此,让我们看一下其他模型:
用户模型
namespace ProjAPI.Models
{
public class Date
{
public DateTime DateInfo;
public Student Student;
public Teacher Teacher;
public Classroom Classroom;
public int Status, Id;
}
}
学生模型
namespace ProjAPI.Models
{
public class User
{
public string Name, LastName, Address, Phone, Pass, Email, Id;
public int Role, Status;
}
}
教师模型
namespace ProjAPI.Models
{
public class Student : User
{
public string YearAndClass;
}
}
<强>课堂教学模式强>
namespace ProjAPI.Models
{
public class Teacher : User
{
public Classroom Classroom;
}
}
<强>建筑模型强>
namespace ProjAPI.Models
{
public class Classroom
{
public Building Building;
public string Id;
public string Name;
}
}
因此,我需要一个查询,该查询将: 1.采取所有的教师信息和学生,将重命名列 这样我就可以在代码中访问它们。 2.采取所有的关于类别的信息,和区别出它们,所以我可以单独访问每个类。 3.获取有关日期的所有信息。
在为了解决这个问题,我创建我的查询中的临时表:
namespace ProjAPI.Models
{
public class Building
{
public string Id;
public int RoomNum;
}
}
cb 是一个临时表,代表我的Dates表中的类。
(
SELECT
Classes.ClassID as cID, Classes.ClassName as cName,
Buildings.BuildingID as bID, Buildings.RoomNum
FROM
Classes
FULL OUTER JOIN
Buildings
on
Classes.BuildingID = Buildings.BuildingID
) as cb,
utcb 是一个临时表,用于代表“日期”表中的老师。
(
SELECT
Buildings.RoomNum as tcRoomNum,
Classes.ClassID as tcID, Classes.BuildingID as tcbID,
Classes.ClassName,ut.*
FROM
Classes,Buildings,
(
SELECT
UserID as tID, Name as tName, LastName as tLastName,
Status as tStatus, Role as tRole, Phone as tPhone,
Email as tEmail, Address as tAddress,Password as tPassword,
ClassID as clID
FROM
Users
LEFT JOIN
Teachers
ON
UserID = TeacherID
) as ut
WHERE
ut.clID=Classes.ClassID
AND Classes.BuildingID = Buildings.BuildingID
) as utcb,
我们是一个临时表,用于在“日期”表中表示学生。
现在,当我创建临时表时,我可以访问它们并正确过滤:
(
SELECT
UserID as sID, Name as sName, LastName as sLastName,
Status as sStatus, Role as sRole, Phone as sPhone,
Email as sEmail, Address as sAddress, Password as sPassword,
YearAndClass
FROM
Users
LEFT JOIN
Students
ON
UserID = StudentID
) as us
我知道我做的不好而且效率低下,但是我一个人做,很艰难,我为自己感到骄傲。 如果任何人有任何的任何的建议,免费升级此查询的感觉,让我知道。