选择具有多个重复字段值的行

Posted

技术标签:

【中文标题】选择具有多个重复字段值的行【英文标题】:Select rows with multiple duplicate field values 【发布时间】:2021-03-09 04:41:03 【问题描述】:

我想在 Django 中选择具有重复值的多行的行。

例如,我有一个看起来像这样的模型

class User:
    first_name = models.CharField(...)
    last_name = models.CharField(...)
    ...

还有一个像这样的数据库

first_name | last_name | ...
---------- | --------- | ...
Paul       | Adams     | ...
John       | Smith     | ...
Tom        | Mueller   | ...
John       | Smith     | ...
John       | Adams     | ...
Paul       | Adams     | ...

我想获得在数据库中多次存在的first_namelast_name 值。其他值不能等于行数。在这个例子中,我想得到“John Smith”和“Paul Adams”。

【问题讨论】:

this 是您问题的答案吗? @Brambor 不,不是。我已经发现了这个问题,但它只适用于一个字段的值重复,而不是多个字段的值。 你不能只使用两次答案来过滤两列吗? 我试过了,还是不行,可能是我做错了什么。我可以稍后再试。 试试.values("first_field", "second_field") 【参考方案1】:

您可以在 views.py 或在您的 django shell 中使用 py manage.py shell

执行此操作
from django.db.models import Count
#import your User model 

users_output = User.objects.values('first_name','last_name').annotate(first_name_count=Count('first_name'),last_name_count = Count('last_name')).filter(first_name_count__gt=1,last_name_count__gt=1)

上面的查询会返回一个类似这样的查询集

<QuerySet
 ['first_name': 'John', 'last_name': 'Smith', 'first_name_count': 2, 'last_name_count': 2,
 'first_name': 'Paul', 'last_name': 'Adams', 'first_name_count': 2, 'last_name_count': 2]
>

【讨论】:

【参考方案2】:

首先,你需要连接字段。

from django.db.models import Count, Value
from django.db.models.functions import Concat

queryset = User.objects.annotate(full_name=Concat('first_name', Value(' '), 'last_name', output_field=CharField())

那么您需要对每个唯一的全名进行分组并计算计数

queryset = queryset.values('full_name').annotate(full_name_count=Count('full_name'))

只过滤计数大于一的那些。

queryset = queryset.filter(full_name_count__gt=1)

【讨论】:

以上是关于选择具有多个重复字段值的行的主要内容,如果未能解决你的问题,请参考以下文章

使用 Activerecord、Rails 和 Postgres 查找具有多个重复字段的行

选择具有相同值的上次更新的行

MYSQL - 将具有多个重复值的行组合起来,然后删除重复项

如何在 MySQL 中删除具有几个相同值的行?

SQL - 选择两列中具有相同值的行

按列分组并选择具有多个最小值的行中的所有字段