mysql select 返回列_SQL / mysql – selectdistinct / UNIQUE,但返回所有列?
你正在尋找一個(gè)組:
select * from table group by field1
偶爾可以寫(xiě)一個(gè)獨(dú)特的聲明:
select distinct on field1 * from table
然而,在大多數(shù)平臺(tái)上,上述兩者都不會(huì)起作用,因?yàn)槠渌猩系男袨槭俏粗付ǖ摹?(MySQL中的第一個(gè)作品,如果這就是你使用的。)
你可以獲取不同的字段,并堅(jiān)持每次select一個(gè)任意的行。
在某些平臺(tái)上(例如PostgreSQL,Oracle,T-SQL),可以直接使用窗口函數(shù)完成:
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)上,你需要編寫(xiě)子查詢(xún),使你能夠自己join整個(gè)表( 例子 ),所以不推薦。
從你的問(wèn)題的措辭,我明白,你要為給定的字段select不同的值,并為每個(gè)這樣的值列出同一行中的所有其他列值。 大多數(shù)DBMS不會(huì)同時(shí)使用DISTINCT和GROUP BY ,因?yàn)榻Y(jié)果不確定。
可以這樣想:如果你的field1不止一次出現(xiàn), field2值將被列出(假設(shè)你在兩行中的field1有相同的值,但在這兩行中有兩個(gè)不同的field2值)。
但是,您可以使用聚合函數(shù)(顯式地為每個(gè)要顯示的字段)并使用GROUP BY而不是DISTINCT :
SELECT field1, MAX(field2), COUNT(field3), SUM(field4), .... FROM table GROUP BY field1
如果我正確地理解了你的問(wèn)題,那就和我剛才的問(wèn)題類(lèi)似。 您希望能夠?qū)ISTINCT的可用性限制到指定的字段,而不是將其應(yīng)用于所有數(shù)據(jù)。
如果你使用GROUP BY而沒(méi)有聚合函數(shù),那么你的GROUP BY將會(huì)是你的DISTINCT文件。
如果你提出你的查詢(xún):
SELECT * from table GROUP BY field1;
它將根據(jù)field1的單個(gè)實(shí)例顯示所有結(jié)果。
例如,如果你有一個(gè)名字,地址和城市的表。 一個(gè)人有多個(gè)地址logging,但你只需要一個(gè)人的地址,你可以查詢(xún)?nèi)缦?#xff1a;
SELECT * FROM persons GROUP BY name;
結(jié)果將只有該名稱(chēng)的一個(gè)實(shí)例將顯示其地址,另一個(gè)將從結(jié)果表中省略。 警告:如果您的文件夾具有primefaces值(如firstName,lastName),您希望由兩者進(jìn)行分組。
SELECT * FROM persons GROUP BY lastName, firstName;
因?yàn)槿绻麅蓚€(gè)人擁有相同的姓氏,而您只按姓氏分組,則其中一個(gè)人將從結(jié)果中省略。 你需要考慮到這些事情。 希望這可以幫助。
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
很好的問(wèn)題@aryaxt – 你可以告訴這是一個(gè)很好的問(wèn)題,因?yàn)槟銌?wèn)了5年前,我今天偶然發(fā)現(xiàn)了這個(gè)問(wèn)題,試圖find答案!
我只是試圖編輯接受的答案,以包括這一點(diǎn),但萬(wàn)一我的編輯沒(méi)有進(jìn)入:
如果你的表不是那么大,并假設(shè)你的主鍵是一個(gè)自動(dòng)遞增的整數(shù),你可以做這樣的事情:
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子句來(lái)做。
例如:
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子句查詢(xún)中select的行。
對(duì)于SQL Server,您可以使用dense_rank和其他窗口函數(shù)來(lái)獲取指定列上具有重復(fù)值的所有行和列。 這是一個(gè)例子…
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的每個(gè)不同組合的行數(shù)。
SELECT * FROM tblname GROUP BY duplicate_values ORDER BY ex.VISITED_ON DESC LIMIT 0 , 30
在ORDER BY我剛剛把例子放在這里,你也可以在這里添加ID字段
這是一個(gè)非常好的問(wèn)題。 我已經(jīng)閱讀了一些有用的答案,但可能我可以添加一個(gè)更精確的解釋。
只要不查詢(xún)其他信息,使用GROUP BY語(yǔ)句減less查詢(xún)結(jié)果的數(shù)量就很容易。 假設(shè)你有下面的表格“位置”。
--country-- --city-- France Lyon Poland Krakow France Paris France Marseille Italy Milano
現(xiàn)在查詢(xún)
SELECT country FROM locations GROUP BY country
將導(dǎo)致:
--country-- France Poland Italy
但是,下面的查詢(xún)
SELECT country, city FROM locations GROUP BY country
…在MS SQL中拋出一個(gè)錯(cuò)誤,因?yàn)槟愕挠?jì)算機(jī)如何知道法國(guó)“里昂”,“巴黎”或“馬賽”三個(gè)城市中的哪一個(gè)在“法國(guó)”右側(cè)的字段?
為了更正第二個(gè)查詢(xún),您必須添加此信息。 一種方法是使用函數(shù)MAX()或MIN(),在所有候選項(xiàng)中select最大值或最小值。 MAX()和MIN()不僅適用于數(shù)值,還可以比較string值的字母順序。
SELECT country, MAX(city) FROM locations GROUP BY country
將導(dǎo)致:
--country-- --city-- France Paris Poland Krakow Italy Milano
要么:
SELECT country, MIN(city) FROM locations GROUP BY country
將導(dǎo)致:
--country-- --city-- France Lyon Poland Krakow Italy Milano
只要您從字母(或數(shù)字)順序的兩端select您的值,這些function就是一個(gè)很好的解決scheme。 但是,如果情況并非如此呢? 讓我們假設(shè)你需要一個(gè)具有某種特征的值,例如以字母“M”開(kāi)始。 現(xiàn)在事情變得復(fù)雜了。
到目前為止,我唯一能find的解決scheme是將整個(gè)查詢(xún)放入子查詢(xún)中,然后用手來(lái)構(gòu)造額外的列:
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
將導(dǎo)致:
--country-- --city-- France Marseille Poland NULL Italy Milano
這可以通過(guò)內(nèi)部查詢(xún)來(lái)完成
$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有效。
例如,如果您的名字有多個(gè)相同的值,但所選列中的姓氏和其他信息不同,則logging將包含在結(jié)果集中。
將GROUP BY添加到您要檢查重復(fù)您的查詢(xún)可能看起來(lái)像字段的字段
SELECT field1, field2, field3, ...... FROM table GROUP BY field1
field1將被檢查以排除重復(fù)的logging
或者你可能會(huì)像查詢(xún)
SELECT * FROM table GROUP BY field1
從SELECT中排除field1的重復(fù)logging
SELECT * from table where field in (SELECT distinct field from table)
總結(jié)
以上是生活随笔為你收集整理的mysql select 返回列_SQL / mysql – selectdistinct / UNIQUE,但返回所有列?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 年利率和年化利率的区别在哪里?
- 下一篇: db2 迁移mysql,mysql 迁移