2009-04-16 106 views
0

我有一個表可能有大約100個記錄左右,用戶名字段。可能有許多記錄具有相同的用戶名。我如何確保每個用戶名只有一條記錄被返回,而不管它是哪一條記錄?sql限制唯一記錄

例如下表

users 

username item firstname lastname 
------------------------------------------------- 
superhans shoes super  hans 
jez   hat  jeremy  sisto 
jez   book jeremy  sisto 
flinto  train fred  flintstone 
superhans shirt super  hans 

只是下將返回:

username item firstname lastname 
------------------------------------------------- 
superhans shoes super  hans 
jez   hat  jeremy  sisto 
flinto  train fred  flintstone 

回答

0
SELECT DISTINCT username, item, firstname FROM users 
+0

這實際上並不奏效。 – SquareCog 2009-04-16 03:42:37

1

首先,你的表格應建造和維護,使得這種狀態不會發生。永遠。

二,我想你想要的是SELECT DISTINCT

+0

爲什麼?也許在他的應用程序中,這是完全合法的,因爲有重複的「用戶名」 – 2009-04-16 03:54:29

+0

如果是這種情況,他爲什麼要返回一個唯一列表並丟棄隨機記錄? – 2009-04-16 03:57:54

4

你可以使用DISTINCT如果你沒有想回到在搜索結果中的項目領域:

SELECT DISTINCT用戶名,名字,姓氏來自用戶的

如果要包括的項目領域,你將不得不這樣做:

SELECT t.username, 
    (SELECT TOP 1 item FROM users WHERE username = t.username) AS item, 
    t.firstname, 
    t.lastname 
FROM (
    SELECT DISTINCT username, item, firstname, lastname 
    FROM users 
) AS t 

使用這樣的查詢沒有多大意義。你能否更具體地瞭解你想要達到的目標?

0

如果您將用戶名存儲在名爲users的表中並使用名爲user_id的唯一id字段,那將是最好的選擇。

然後用USER_ID作爲foriegn鍵存儲在與用戶...如購買,用戶信息等

0

使用戶名主鍵表中的數據 - 這樣,就可以確保唯一性

3

在MySQL 5(你不提,但你已經標記了這個問題mysql的,所以我會假設),您可以:

SELECT * 
FROM users 
GROUP BY username 

,你會得到一個任意行後面爲每個用戶

Mysql Refman 11.11.3

MySQL的擴展使用GROUP BY的,這樣就可以使用非聚合列或計算,在不出現在GROUP BY子句中的SELECT列表。 [...]如果從GROUP BY部分省略的列在組中不是常量,則不要使用此功能。服務器可以自由地返回組中的任何值,所以結果是不確定的,除非所有值都相同。

其實,思考它,你可能想要做

SELECT username, GROUP_CONCAT(DISTINCT item), whatever 
FROM users 
GROUP BY username 

,這將給你的所有他們的項目清單。取決於你爲什麼首先想要那個任意的行。

----- N