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不会同时使用DISTINCT
和GROUP 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)