从mysql中选择数据时如何避免重复输入?

时间:2015-10-23 12:39:37

标签: php mysql

我有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";

2 个答案:

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

将检索具有相关医疗数据的学生数据。如果学生没有医疗数据,他的身份和姓名将被设置,医疗数据将被设置为空。