2017-07-27 53 views
1

我有一個SQL表,目前看起來像這樣具有相同值的多個行選擇單行:如何從SQL表中的列

id | Name | Age| City 
______________________________ 
1 | Mike | 26 | New York 
2 | Nick | 32 | London 
3 | Anne | 22 | New York 
4 | Andy | 24 | Lagos 
5 | Nickie | 27 | Paris 
6 | Sam | 26 | London 

我需要查詢表返回類似:

id | Name | Age| City 
______________________________ 
1 | Mike | 26 | New York 
2 | Nick | 32 | London 
3 | Andy | 24 | Lagos 
4 | Nickie | 27 | Paris 

使之與相同值的所有行特定的列(城市在這個例子中)得到返回只有一次(被退回只能用相同的列值的多個行1)。如果我添加時間戳列,那麼我只想顯示最新的行。我如何通過你的City列刪除重複寫SQL

+0

使用'LIMIT <數量限制到>'。你可以在你的時間戳列'DESC'上進行'ORDER BY',然後限制到1以獲得最新的。 – Kdawg

+1

什麼是您的RDBMS(SQL * flavor *)? –

回答

2

如果您有一個類型爲TIMESTAMP的列date_edited,那麼您可以編寫如下所示的查詢。

SET @@sql_mode='ONLY_FULL_GROUP_BY'; 
SELECT Name, Age, 
GROUP_CONCAT(DISTINCT City ORDER BY date_edited DESC) AS city 
FROM TABLE_NAME 
GROUP BY City 
ORDER BY date_edited DESC 
+0

謝謝@ vjy的設置問題。我不斷收到錯誤。在phpMyAdmin控制檯上,我得到這個錯誤_#1055 - SELECT list的表達式#1不在GROUP BY子句中,並且包含非聚集列'example.test.name',它在功能上依賴於GROUP BY子句中的列;這與sql_mode = only_full_group_by_ – banky

+0

不兼容您用於城市列的數據類型是什麼? –

+0

你必須啓用ONLY_FULL_GROUP_BY選項 –

2
SELECT Name, Age, City, MAX(TIME_STAMP_COLUMN) FROM YOUR_TABLE GROUP BY City; 

此查詢將選擇所有的行,將它們分組,然後返回一行具有最大,或最近,時間戳每個分組城市與之相關聯。

+0

不錯,我看了一個錯誤的過去的例子,但現在修復它 – yanman1234

+0

這仍然是無效的SQL,因爲'group by'是無效的。你需要包含'name'和'age'以及 –

+0

謝謝@ yanman1234。問題是當我在myPhpAdmin控制檯上嘗試時,我不斷收到這個錯誤「#1055 - SELECT列表的表達式#1不在GROUP BY子句中,並且包含非聚集列'example.test.name',它在功能上不依賴於GROUP中的列BY子句;這與sql_mode = only_full_group_by「不兼容。這可能是我的phpMyAdmin – banky

1

在大多數數據庫中,您將使用ANSI標準row_number()功能:

select t.* 
from (select t.*, row_number() over (partition by city order by city) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

,如果你想在最新的專欄中,您將使用order by timestamp desc

1

禁用only_full_group_by如果你是WAMP按以下順序: 上WAMP的圖標時,MySQL,MySQL的設置,SQL模式,用戶模式左擊。然後重新啓動您的WAMP服務。然後在服務重啓後嘗試你的SQL

+0

謝謝@靈活......你拯救了我的一天 – banky