Django 解决distinct无法去除重复数据的问题
作者:CQ-LQJ 发布时间:2023-02-09 22:13:22
使用distinct在mysql中查询多条不重复记录值的解决办法
如何使用distinct在mysql中查询多条不重复记录值?
有时候想用distinct去掉queryset中的重复项,看django文章中是这么说的
>>> Author.objects.distinct()
[...]
>>> Entry.objects.order_by('pub_date').distinct('pub_date')
[...]
>>> Entry.objects.order_by('blog').distinct('blog')
[...]
>>> Entry.objects.order_by('author', 'pub_date').distinct('author', 'pub_date')
[...]
>>> Entry.objects.order_by('blog__name', 'mod_date').distinct('blog__name', 'mod_date')
[...]
>>> Entry.objects.order_by('author', 'pub_date').distinct('author')
[...]
Note
django文档 * 别介绍了,distinct的列一定要先order_by并且在第一项。
When you specify field names, you must provide an order_by() in the QuerySet, and the fields in order_by() must start with the fields in distinct(), in the same order.
For example, SELECT DISTINCT ON (a) gives you the first row for each value in column a. If you don't specify an order, you'll get some arbitrary row.
完全照做,用的mysql数据库最后出现了这样的警告:
raise NotImplementedError('DISTINCT ON fields is not supported by this database backend')
NotImplementedError: DISTINCT ON fields is not supported by this database backend
告诉我数据库不支持。
当然可以这样:
items = []
for item in query_set:
if item not in items:
items.append(item)
首先,我们必须知道在django中模型执行查询有两种方法:
第一种,使用django给出的api,例如filter value distinct order_by等模型查询api;
代码:LOrder.objects.values('finish_time').distinct()
这里应注意,原官方文档中写到:
示例(第一个之后的示例都只能在PostgreSQL 上工作):
>>> Author.objects.distinct() [...] >>> Entry.objects.order_by('pub_date').distinct('pub_date') [...] >>> Entry.objects.order_by('blog').distinct('blog') [...] >>> Entry.objects.order_by('author', 'pub_date').distinct('author', 'pub_date') [...] >>> Entry.objects.order_by('blog__name', 'mod_date').distinct('blog__name', 'mod_date') [...] >>> Entry.objects.order_by('author', 'pub_date').distinct('author')
因为我使用的mysql数据库,所以在distinct只能是第一中用法,或者可以这样用
LOrder.objects.values('finish_time').distinct().order_by('finish_time')
第二种,使用原始SQL查询
LOrder.objects.raw('SELECT DISTINCT id,finish_time FROM keywork_lorder group by finish_time')
上面直接使用mysql语句进行剔重,这里需要特别注意的是:
一是原始SQL查询只有一种字段不可以被丢掉,官方文档中这样说道:
只有一种字段不可以被省略——就是主键。 Django 使用主键来识别模型的实例,所以它在每次原始查询中都必须包含。 如果你忘记包含主键的话,会抛出一个InvalidQuery异常。
意思是,如果你的sql语句是这样的'SELECT DISTINCT finish_time FROM keywork_lorder ',那么将会报错Raw query must include the primary key,就是id字段不能被丢掉!
二是,这里是原始mysql查询语句,mysql去掉重复项要这样写:'SELECT DISTINCT id,finish_time FROM keywork_lorder group by finish_time'
补充:使用Distinct去除重复数据
distinct用于在查询中返回列的唯一不同值(即去重复),支持单列或多列。
在实际的应用中,表中的某一列含有重复值是很常见的,如employee员工表的dept部门列。
如果在查询数据时,希望得到某列的所有不同值,可以使用distinct。
distinct 语法
select 【distinct】 column_name1,column_name2
from table_name;
下面开始操作
创建一个足迹表
create table footprint(
id int not null auto_increment primary key,
username varchar(30) comment '用户名',
city varchar(30) comment '城市',
visit_date varchar(10) comment '到访日期'
);
插入一些数据
insert into footprint(username, city, visit_date) values('mofei', '贵阳', '2019-12-05');
insert into footprint(username, city, visit_date) values('mofei', '贵阳', '2020-01-15');
insert into footprint(username, city, visit_date) values('mofei', '北京', '2018-10-10');
insert into footprint(username, city, visit_date) values('zhangsan', '上海', '2020-01-01');
insert into footprint(username, city, visit_date) values('zhangsan', '上海', '2020-02-02');
insert into footprint(username, city, visit_date) values('lisi', '拉萨', '2016-12-20');
这些用户到访过那些城市
mysql> select distinct city from footprint;
和group by 效果相同,只不过distinct专门负责去重复这个活
mysql> select city from footprint group by city;
查询有几个用户在使用系统
mysql> select distinct username from footprint;
dictinct作用于两个字段时,多条数据都相同时会保留一条
以上内容来自墨菲墨菲的补充
补充知识:Distinct和Group by去除重复字段记录
重复记录 有两个意义,一是完全重复的记录,也即所有字段均重复的记录
二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
1、对于第一种重复,比较容易解决,使用
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name
select * from #Tmp where autoID in(select autoID from #tmp2)
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
其它的数据库可以使用序列,如:
create sequence seq1;
select seq1.nextval as autoID, * into #Tmp from tableName
zuolo: 我根据上面实例得到所需要的语句为 SELECT MAX(id) AS ID,Prodou_id,FinalDye FROM anwell..tblDBDdata GROUP BY Prodou_id,FinalDye ORDER BY id,之前一直想用Distinct来得到指定字段不重复的记录是个误区。
来源:https://www.cnblogs.com/CQ-LQJ/p/5133390.html
猜你喜欢
- 博主作为爬虫初学者,本次使用了requests和beautifulsoup库进行数据的爬取爬取网站:http://datachart.500
- pyenv简单介绍在日常运维中, 经常遇到这样的情况: 系统自带的Python是2.x,而业务部署需要Python 3.x 环境, 此时需要
- 桑基图简介很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况。例如,以居民如何从一个国家迁移到另一个国家为例。这里演示了有多少居民
- 推荐的国内镜像站[ 个人推荐清华大学pypi镜像站(https://mirrors.tuna.tsinghua.edu.cn/help/py
- php中主要用到的就是要用到fread()和fwirte()。而静态页面生成了之后,就会牵扯到修改的问题。这里可以用到正则匹配的方法来替换模
- 有些时候我们需要得到刚刚插入数据库中的条目id,用于相关系统的更改,在以前我是使用select+top 1+desc 这种笨方法实现的,在没
- 目录一、建立画布二、用plt.subplot函数建立坐标系,并分别绘制折线图和柱状图三、完整代码如下所示四、对应效果图如下所示一、建立画布i
- 前言:在日常开发的过程中,有时候会临时用到一些简单的函数,她们的业务逻辑会相对简单,简单到并不值得让他们留下名字,这个时候,就很值得使用匿名
- 1、简要说明结巴分词支持三种分词模式,支持繁体字,支持自定义词典2、三种分词模式全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快
- 对于部署在新浪应用引擎SAE上的项目,使用新浪SAE云存储是不错的存储方案。新浪SAE云存储仅能在SAE环境中正常使用,对它进行简单封装后,
- 本文实例讲述了Python实现复杂对象转JSON的方法。分享给大家供大家参考,具体如下:在Python对于简单的对象转json还是比较简单的
- 正文本文简要介绍Python自然语言处理(NLP),使用Python的NLTK库。NLTK是Python的自然语言处理工具包,在NLP领域中
- PIL 图像处理库PIL(Python Imaging Library) 是 Python 平台的图像处理标准库。不过 PIL 暂不支持 P
- 1、导入第三方库import urllib.request,urllib.error #请求网页from bs4 import
- 最近有一个小项目,有如下的需求:将某几个源码文件夹进行打包,文件夹内有py文件、dll文件、exe文件等各种文件类型打包生成的安装包,在进行
- 前言在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题。Python标准库里面提供了json序列化的工具,我
- Function ChkInvaildWord(Words) Const InvaildWords=&quo
- 一、数据集下载加州高速公路PEMS数据集这里绘制PEMS04中的交通流量数据。该数据集中包含旧金山2018年1月1日至2月28日的29条道路
- 关于高性能的分布式内存对象缓存系统Memcached,我们在另一篇文章中有提到过“在windows系统下如何安装memcached的讲解”,
- 引言上一篇文章中引入了消息队列对秒杀流量做削峰的处理,我们使用的是Kafka,看起来似乎工作的不错,但其实还是有很多隐患存在,如果这些隐患不