2009-04-16 86 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