我有4个学生表,教育,访问,医疗数据。我正在尝试创建类似高级搜索表单的内容,用户可以在其中输入条件。来自学生表我从教育中获取学生的姓名,电话,地址等我正在获得小组,部门和创建以及大学名称。从访问我试图获得speciallistApointmant可能会有更多,然后其中一个。使用桥表student_to_visit,student_to_education和medicaldata_to_student来关联表
这是我目前正在使用的SQL查询
SELECT
DISTINCT
s.ID,
m.vision,
m.hearing,
m.movement,
m.cardno,
v.speciallistApointmant,
s.fio,
s.birthdate,
edge,
gender,
homeaddress,
actualaddress,
phone,
workplace,
enterence,
financesource,
studyform,
c.gruppa,
c.greate,
c.departmant
FROM
student s,
education_to_student b,
education c,
student_to_visit sv,
visits v,
medicaldata_to_student ms,
medicaldata m
where
b.student_id = s.id
and b.education_id = c.id
and ms.student_id=s.id
and ms.medical_id=m.id
and sv.student_id=s.id
and sv.visit_id=v.id
and gender = 1
因为因为一个学生可以访问更多,所以一个专科学生被展示多一次。此外,如果没有特定学生的访问,学生不会出现在查询结果中。在上面的示例中,我尝试选择性别= 1的学生,但可能会有更多参数。如何正确构建此查询?
以下是带有表单的PHP代码:
public function getstats($gender,$greate,$edge,$financesource,$birthdate,$hearing,$vision,$movement,$cardno,$speciallistApointmant)
{
//where begin
$where=" where b.student_id = s.id and b.education_id = c.id and ms.student_id=s.id and ms.medical_id=m.id and sv.student_id=s.id and sv.visit_id=v.id";
// echo var_dump($gender);
if ($gender!='')
{
echo var_dump($gender);
$where .=" and gender = $gender";
// echo var_dump($gender);
}
if (!empty($greate))
{
$where .="and greate='$greate'";
}
if (!empty($edge))
{
$where .="and edge='$edge' ";
}
if (!empty($financesource))
{
$where .="and financesource='$financesource'";
}
//birthdate add here
//end
if (!empty($hearing))
{
$where.="and hearing='$hearing";
}
if (!empty($vision))
{
$where .="and vision='$vision'";
}
if (!empty($movement))
{
$where .="and movement='$movement'";
}
if (!empty($cardno))
{
$where.="and cardno='$cardno'";
}
if (!empty($speciallistApointmant))
{
$where .="and speciallistApointmant='$speciallistApointmant'";
}
//echo var_dump($where);
//where end
$sql = "SELECT DISTINCT s.ID, m.vision, m.hearing, m.movement, m.cardno,v.speciallistApointmant, s.fio, s.birthdate, edge, gender, homeaddress, actualaddress, phone, workplace, enterence, financesource, studyform, c.gruppa, c.greate, c.departmant\n"
. "FROM student s, education_to_student b, education c,student_to_visit sv, visits v,medicaldata_to_student ms, medicaldata m"."$where";
答案 0 :(得分:1)
SELECT DISTINCT使用列出的所有字段来确定行是否是不同的,因为您使用了select中的所有教育,访问和医疗数据字段,您将获得具有不同访问权限的重复学生(或其他表格类似)
如果您需要查询中的其他表数据(不仅仅是学生数据),请查看GROUP BY并使用其他表字段的聚合函数(count,min,max等)。
如果您只需要学生列表,请从SELECT短语中删除其他表格列。您可以在WHERE短语中使用列,即使它们不在SELECT短语中。
另外:您应该使用PDO(或其他数据库层)并准备查询以防止SQL注入攻击。
答案 1 :(得分:0)
此外,如果没有特定学生的访问,学生也不会出现在查询结果中。
您可以使用左连接或右连接来检索孤立,即与另一个表中的记录无关的数据。例如
SELECT s.ID, s.name, m.vision, m.hearing FROM Student s LEFT JOIN medicaldata_to_student ms on s.id=md.student_id LEFT JOIN medicaldata m on ms.medical_id=m.id;
将检索具有相关医疗数据的学生数据。如果学生没有医疗数据,他的身份和姓名将被设置,医疗数据将被设置为空。