SQL / mysql – selectdistinct / UNIQUE,但返回所有列?

SELECT DISTINCT field1, field2, field3, ...... FROM table 

我正试图完成下面的SQL语句,但我希望它返回所有列是可能的? 就像是:

 SELECT DISTINCT field1, * from table 

你正在寻找一个组:

 select * from table group by field1 

偶尔可以写一个独特的声明:

 select distinct on field1 * from table 

然而,在大多数平台上,上述两者都不会起作用,因为其他列上的行为是未指定的。 (MySQL中的第一个作品,如果这就是你使用的。)

你可以获取不同的字段,并坚持每次select一个任意的行。

在某些平台上(例如PostgreSQL,Oracle,T-SQL),可以直接使用窗口函数完成:

 select * from ( select *, row_number() over (partition by field1 order by field2) as row_number from table ) as rows where row_number = 1 

在其他人(MySQL,SQLite)上,你需要编写子查询,使你能够自己join整个表( 例子 ),所以不推荐。

从你的问题的措辞,我明白,你要为给定的字段select不同的值,并为每个这样的值列出同一行中的所有其他列值。 大多数DBMS不会同时使用DISTINCTGROUP BY ,因为结果不确定。

可以这样想:如果你的field1不止一次出现, field2值将被列出(假设你在两行中的field1有相同的值,但在这两行中有两个不同的field2值)。

但是,您可以使用聚合函数(显式地为每个要显示的字段)并使用GROUP BY而不是DISTINCT

 SELECT field1, MAX(field2), COUNT(field3), SUM(field4), .... FROM table GROUP BY field1 

如果我正确地理解了你的问题,那就和我刚才的问题类似。 您希望能够将DISTINCT的可用性限制到指定的字段,而不是将其应用于所有数据。

如果你使用GROUP BY而没有聚合函数,那么你的GROUP BY将会是你的DISTINCT文件。

如果你提出你的查询:

 SELECT * from table GROUP BY field1; 

它将根据field1的单个实例显示所有结果。

例如,如果你有一个名字,地址和城市的表。 一个人有多个地址logging,但你只需要一个人的地址,你可以查询如下:

 SELECT * FROM persons GROUP BY name; 

结果将只有该名称的一个实例将显示其地址,另一个将从结果表中省略。 警告:如果您的文件夹具有primefaces值(如firstName,lastName),您希望由两者进行分组。

 SELECT * FROM persons GROUP BY lastName, firstName; 

因为如果两个人拥有相同的姓氏,而您只按姓氏分组,则其中一个人将从结果中省略。 你需要考虑到这些事情。 希望这可以帮助。

 SELECT c2.field1 , field2 FROM (SELECT DISTINCT field1 FROM dbo.TABLE AS C ) AS c1 JOIN dbo.TABLE AS c2 ON c1.field1 = c2.field1 

很好的问题@aryaxt – 你可以告诉这是一个很好的问题,因为你问了5年前,我今天偶然发现了这个问题,试图find答案!

我只是试图编辑接受的答案,以包括这一点,但万一我的编辑没有进入:

如果你的表不是那么大,并假设你的主键是一个自动递增的整数,你可以做这样的事情:

 SELECT table.* FROM table --be able to take out dupes later LEFT JOIN ( SELECT field, MAX(id) as id FROM table GROUP BY field ) as noDupes on noDupes.id = table.id WHERE //this will result in only the last instance being seen noDupes.id is not NULL 

你可以用WITH子句来做。

例如:

 WITH c AS (SELECT DISTINCT a, b, c FROM tableName) SELECT * FROM tableName r, c WHERE c.rowid=r.rowid AND ca=ra AND cb=rb AND cc=rc 

这也允许您仅select在WITH子句查询中select的行。

对于SQL Server,您可以使用dense_rank和其他窗口函数来获取指定列上具有重复值的所有行和列。 这是一个例子…

 with t as ( select col1 = 'a', col2 = 'b', col3 = 'c', other = 'r1' union all select col1 = 'c', col2 = 'b', col3 = 'a', other = 'r2' union all select col1 = 'a', col2 = 'b', col3 = 'c', other = 'r3' union all select col1 = 'a', col2 = 'b', col3 = 'c', other = 'r4' union all select col1 = 'c', col2 = 'b', col3 = 'a', other = 'r5' union all select col1 = 'a', col2 = 'a', col3 = 'a', other = 'r6' ), tdr as ( select *, total_dr_rows = count(*) over(partition by dr) from ( select *, dr = dense_rank() over(order by col1, col2, col3), dr_rn = row_number() over(partition by col1, col2, col3 order by other) from t ) x ) select * from tdr where total_dr_rows > 1 

这是col1,col2和col3的每个不同组合的行数。

 SELECT * FROM tblname GROUP BY duplicate_values ORDER BY ex.VISITED_ON DESC LIMIT 0 , 30 

ORDER BY我刚刚把例子放在这里,你也可以在这里添加ID字段

这是一个非常好的问题。 我已经阅读了一些有用的答案,但可能我可以添加一个更精确的解释。

只要不查询其他信息,使用GROUP BY语句减less查询结果的数量就很容易。 假设你有下面的表格“位置”。

 --country-- --city-- France Lyon Poland Krakow France Paris France Marseille Italy Milano 

现在查询

 SELECT country FROM locations GROUP BY country 

将导致:

 --country-- France Poland Italy 

但是,下面的查询

 SELECT country, city FROM locations GROUP BY country 

…在MS SQL中抛出一个错误,因为你的计算机如何知道法国“里昂”,“巴黎”或“马赛”三个城市中的哪一个在“法国”右侧的字段?

为了更正第二个查询,您必须添加此信息。 一种方法是使用函数MAX()或MIN(),在所有候选项中select最大值或最小值。 MAX()和MIN()不仅适用于数值,还可以比较string值的字母顺序。

 SELECT country, MAX(city) FROM locations GROUP BY country 

将导致:

 --country-- --city-- France Paris Poland Krakow Italy Milano 

要么:

 SELECT country, MIN(city) FROM locations GROUP BY country 

将导致:

 --country-- --city-- France Lyon Poland Krakow Italy Milano 

只要您从字母(或数字)顺序的两端select您的值,这些function就是一个很好的解决scheme。 但是,如果情况并非如此呢? 让我们假设你需要一个具有某种特征的值,例如以字母“M”开始。 现在事情变得复杂了。

到目前为止,我唯一能find的解决scheme是将整个查询放入子查询中,然后用手来构造额外的列:

 SELECT countrylist.*, (SELECT TOP 1 city FROM locations WHERE country = countrylist.country AND city like 'M%' ) FROM (SELECT country FROM locations GROUP BY country) countrylist 

将导致:

 --country-- --city-- France Marseille Poland NULL Italy Milano 

这可以通过内部查询来完成

 $query = "SELECT * FROM (SELECT field FROM table ORDER BY id DESC) as rows GROUP BY field"; 

只需在GROUP BY子句中包含所有的字段。

SELECT DISTINCT如果所有三列的值在表中都是唯一的,则FIELD1,FIELD2,FIELD3 FROM TABLE1有效。

例如,如果您的名字有多个相同的值,但所选列中的姓氏和其他信息不同,则logging将包含在结果集中。

将GROUP BY添加到您要检查重复您的查询可能看起来像字段的字段

 SELECT field1, field2, field3, ...... FROM table GROUP BY field1 

field1将被检查以排除重复的logging

或者你可能会像查询

 SELECT * FROM table GROUP BY field1 

从SELECT中排除field1的重复logging

 SELECT * from table where field in (SELECT distinct field from table)