Mysql 如何从一个或多个结果集中删除基于列的重复项
我以以下方式从同一个表中获得两个结果集:Mysql 如何从一个或多个结果集中删除基于列的重复项,mysql,sql,peewee,Mysql,Sql,Peewee,我以以下方式从同一个表中获得两个结果集: | id | name | age | ------------------------------------- | 1 | John | 12 | | 2 | Jim | 23 | | 3 | Joel | 54 | | 4 | Jane | 12 |
| id | name | age |
-------------------------------------
| 1 | John | 12 |
| 2 | Jim | 23 |
| 3 | Joel | 54 |
| 4 | Jane | 12 |
如果我基于一个时间间隔创建resultset,并且一行在一个或多个resultset之间重复出现,那么如何根据name
列有效地过滤这些结果集?结果集的数量为1..x
我应该:循环遍历集合,同时组合集合和过滤器,还是可以直接使用SQL进行查询并删除重复项
由于我使用peewee
我的查询如下:
result_1 = Users.select().where(Users.age > 10)
result_2 = Users.select().where(Users.age > 20)
更新:
实际表中没有重复项,只对结果集进行了访问,我希望创建一个没有重复项的结果集,或者合并所有结果集而没有重复项。您可以尝试以下操作:(CLM是重复列)
如果我理解正确,这就是开箱即用的功能:
SELECT ID, Name, Age
FROM Users
WHERE Age > 10
UNION
SELECT ID, Name, Age
FROM Users
WHERE Age > 20;
您可以进行多次选择。要求是selects必须返回相同数量的列,且类型兼容
编辑:如果需要额外筛选,请将联合包装在派生表中:
SELECT *
FROM
(
SELECT ID, Name, Age
FROM Users
WHERE Age > 10
UNION
SELECT ID, Name, Age
FROM Users
WHERE Age > 20
) X
WHERE x.Name LIKE 'Jo%';
请再次检查我的问题,特别是
更新
区域。如何创建结果集?显示查询。@HamletHakobyan,我使用peewee,但它生成的是我们所知道的非常简单的查询。我很可能需要在rawquery而不是peewee中执行此特定任务。这与我自己所做的非常接近,但是如果我只想使用Name
列而不是ID
和Age
?换句话说,在该年龄间隔内只能有一个Jane
,即使表中还有更多。更新-AFAIK派生表的性能不如视图,但是,与视图不同,在应用外部筛选器之前,联合选择的性能不如视图。Oracle和SqlServer都有CTE解决了视图和派生表之间的这种脱节问题。我不确定这是否能完全解决这个问题。基于内部联合的结果,如何筛选出所有重复的名称
,以便只出现一次,例如Jane
,这适用于所有其他名称
。正如我现在看到的,附加筛选器上的WHERE子句只是硬编码的。换句话说,我希望联合基于名称
,而不是年龄
或id
。换句话说,我希望联合
基于名称
,这应该可以解决问题,但是我的结果集将只包含name
。
SELECT *
FROM
(
SELECT ID, Name, Age
FROM Users
WHERE Age > 10
UNION
SELECT ID, Name, Age
FROM Users
WHERE Age > 20
) X
WHERE x.Name LIKE 'Jo%';