Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在从mysql中选择数据时避免重复条目?

如何在从mysql中选择数据时避免重复条目?
EN

Stack Overflow用户
提问于 2015-10-23 04:39:37
回答 2查看 141关注 0票数 0

我有四张桌子--学生,教育,访问,医疗资料。我正在尝试创建一些类似高级搜索表单,用户可以在其中输入标准。从学生表中获取学生的姓名、电话、地址等,我得到的是小组、系、创建和大学的名称。从我的访问中,我试图让speciallistApointmant,有可能有更多的其中之一。表使用桥表student_to_visit、student_to_education和medicaldata_to_student进行关联。

下面是我当前使用的sql查询

代码语言:javascript
运行
AI代码解释
复制
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

因为一名学生可以多看一次,所以一名专业学生会多看一次。另外,如果没有访问特定的学生,该学生不会出现在查询结果中。在上面的例子中,我尝试用gender=1来选择学生,但是有可能会有更多的参数。如何正确构建此查询?

下面是带有表单的PHP代码:

代码语言:javascript
运行
AI代码解释
复制
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";
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-23 05:14:53

select DISTINCT使用列出的所有字段来确定某一行是否不同,因为您在选择中使用了所有教育、访问和医疗数据字段,您将得到具有不同访问(或类似于其他表)的重复学生。

如果您需要查询中的其他表数据(不仅仅是学生数据),请查看GROUP,并对其他表字段使用聚合函数(count、min、max等)。

如果您只需要一个学生列表,请从选择短语中删除其他表列。您可以在WHERE短语中使用列,即使它们不在SELECT短语中。

另外:您应该真正使用PDO (或其他DB层),并准备好查询以防止SQL注入攻击。

票数 1
EN

Stack Overflow用户

发布于 2015-10-25 23:45:39

另外,如果没有访问特定的学生,该学生不会出现在查询结果中。

您可以使用左联接右联接来检索孤儿,即与另一个表中的记录无关的数据。例如

代码语言:javascript
运行
AI代码解释
复制
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;

将用相关的医学数据检索学生数据。如果一个学生没有医学数据,他的id和他的名字将被设置,医疗数据将被设置为null。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33302566

复制
相关文章
MySQL避免插入重复数据
设置唯一索引,可以是联合字段,比如你觉得id不够,你还可以id+name,还可以id+age+name这样子的唯一索引。
乐心湖
2020/07/31
2.9K0
MySQL 插入数据时如何不插入重复的数据
针对一些基础业务数据如用户表,要保证主键Primary或Unique不重复,如果在插入时做判断,效率低且代码复杂。
IT工作者
2021/12/30
7.5K0
Mysql 4 种方式避免重复插入数据!
最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下:
xcbeyond
2021/01/26
2.2K0
Mysql 4种方式避免重复插入数据!
最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下:
xcbeyond
2020/11/03
12.6K0
Mysql 4种方式避免重复插入数据!
Mysql批量插入数据时如何解决重复问题?
基本用法:on dupdate key update 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。
码农编程进阶笔记
2022/08/18
1.8K0
Mysql批量插入数据时如何解决重复问题?
MYSQL 如何删除表中重复数据
  可以看到上述表中id为4,5,6,8 是完全重复的数据,我们需要删除这些数据,我的逻辑是什么呢,就是每条数据分组后 取 id 最小的 那个 留下来,其余的进行删除
很酷的站长
2022/11/27
8.5K0
MYSQL 如何删除表中重复数据
Mysql4种方式避免重复插入数据!
最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下:
BUG弄潮儿
2020/10/19
2.8K0
如何避免 Cronjob 重复运行
Cronjob使用中有很多问题需要注意,前段时间写了一篇文章《为什么 Cronjob 不执行》,里面谈到了各种会导致cronjob不执行的因素和解决方案,而本文就cronjob重复运行的场景,对技术手段、技术方案、具体代码和相互优劣展开详细讲解。
33178
2022/08/23
1.6K0
站长须知:HTTP迁移HTTPS时,如何避免发生重复内容问题
目前,网络传输协议已逐步倾向于HTTPS加密协议。而HTTP升级到HTTPS的方法并不难,只需部署一张SSL证书即可,其安装方法并不难。具体系统安装SSL证书方法可参考GDCA SSL证书部署指南。但是其过程有一个比较复杂的问题,就是站点迁移到HTTPS。 HTTP站点迁移到HTTPS时,并非是新建一个站点。如果操作出错,Google就会认为你在新建一个站点。在迁移过程中,会因为重复的内容,新的协议站点会在Google重新计算。毕竟HTTP与HTTPS确实存在差异,一个是为客户端与服务端提供加密协议,是
企鹅号小编
2018/02/07
1.2K0
站长须知:HTTP迁移HTTPS时,如何避免发生重复内容问题
MySQL 中查找重复数据,删除重复数据
数据库版本 Server version: 5.1.41-community-log MySQL Community Server (GPL)
很酷的站长
2022/11/27
7.7K0
MySQL 中查找重复数据,删除重复数据
机器学习准备数据时如何避免数据泄漏
本篇文章主要介绍了几种常用的数据准备方法,以及在数据准备的过程中如何避免数据泄露。
Sam Gor
2020/09/04
1.6K0
机器学习准备数据时如何避免数据泄漏
MySQL避免插入重复记录的方法
mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。 1、insert ignore 2、replace into 3、insert on duplicate key update
IT工作者
2022/01/26
2.3K0
经验:在MySQL数据库中,这4种方式可以避免重复的插入数据!
最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下:
哲洛不闹
2020/09/17
4.5K0
经验:在MySQL数据库中,这4种方式可以避免重复的插入数据!
避免重复内容
重复内容是指有两个或者更多的页面有相同或者基本相同的内容。我们必须避免重复内容以免被搜索引擎惩罚。但是有时候我们需要在页面上显示2个(获这个更多)日志列表,通常我们是通过多个循环(一个标准的循环,一个来自特定的分类的循环)来实现。这样通常是你就能不仅想推荐最新写的日志,同时来自某个特定的分类。
Denis
2023/04/13
6950
MySQL 如何处理重复数据
有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。
用户1685462
2021/07/17
2.1K0
当删库时如何避免跑路
删库跑路也是个老梗了,可见在运维数据库的过程中误删除数据,或者开发的代码有bug,造成数据的误删除屡见不鲜。不过现在也有许多用于恢复或预防误删除的方案,例如SQL管理系统,将要执行的SQL先交由管理员审核,然后由管理员备份一个镜像数据库,在镜像上执行该SQL,并在执行后还原镜像。这样经过层层把关就可以大大减小出现误操作的几率。
端碗吹水
2020/09/23
1K0
当删库时如何避免跑路
删除MySQL表中的重复数据?
一般我们将数据存储在MySQL数据库中,它允许我们存储重复的数据。但是往往重复的数据是作废的、没有用的数据,那么通常我们会使用数据库的唯一索引 unique 键作为限制。问题来了啊,我还没有创建唯一索引捏,数据就重复了(我就是忘了,怎么滴)。
青衫染红尘
2023/02/28
7.3K0
MySQL如何避免使用swap
对于DBA来说Linux比较让人头疼的一个地方是,它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上。对于频繁进行读写操作的系统而言,数据看似在内存而实际上在磁盘是非常糟糕的,响应时间的增长很可能直接拖垮整个系统。这篇blog主要讲讲我们作为DBA,怎样尽量避免MySQL惨遭swap的毒手。 首先我们要了解点基础的东西,比如说为什么会产生swap。假设我们的物理内存是16G,swap是4G。如果MySQL本身已经占用了12G物理内存,而同时其他程序或者系统模块又需要6G内存,这时候操作系统就可能把MySQL所拥有的一部分地址空间映射到swap上去。 cp一个大文件,或用mysqldump导出一个很大的数据库的时候,文件系统往往会向Linux申请大量的内存作为cache,一不小心就会导致L使用swap。
保持热爱奔赴山海
2019/09/18
2.3K0
TP数据避免重复和去重处理
alter table gift_doc add unique index(num_id);
php007
2020/02/14
2.6K0
TP数据避免重复和去重处理
oracle中如何删除重复数据
        我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢?         重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。 一、对于部分字段重复数据的删除         先来谈谈如何查询重复的数据吧。         下面语句可以查询出那些数据是重复的:   select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1         将上面的>号改为=号就可以查询出没有重复的数据了。         想要删除这些重复的数据,可以使用下面语句进行删除   delete from 表名 a where 字段1,字段2 in     (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)         上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:   CREATE TABLE 临时表 AS   (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)         上面这句话就是建立了临时表,并将查询到的数据插入其中。         下面就可以进行这样的删除操作了:   delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);         这种先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。        这个时候,大家可能会跳出来说,什么?你叫我们执行这种语句,那不是把所有重复的全都删除吗?而我们想保留重复数据中最新的一条记录啊!大家不要急,下面我就讲一下如何进行这种操作。        在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录, 我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。        下面是查询重复数据的一个例子:   select a.rowid,a.* from 表名 a  where a.rowid !=  (   select max(b.rowid) from 表名 b   where a.字段1 = b.字段1 and   a.字段2 = b.字段2  )        下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。        而外面就是查询出除了rowid最大之外的其他重复的数据了。        由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:  delete from 表名 a  where a.rowid !=  (   select max(b.rowid) from 表名 b   where a.字段1 = b.字段1 and   a.字段2 = b.字段2  )        随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。   create table 临时表 as     select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;   delete from 表名 a  where a.rowid !=  (   select b.dataid from 临时表 b   where a.字段1 = b.字段1 and   a.字段2 = b.字段2  );  commit; 二、对于完全重复记录的删除         对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:   select distinct * from 表名   可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:   CREATE TABLE 临时表 AS (select distinct * from 表名);   truncate table 正式表;            --注:原先由于笔误写成了drop table 正式表;,现在已经改正过来   insert into 正式表 (select * from 临时表);   drop table 临时表;
源哥
2018/08/28
2.4K0

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文