sql限制唯一记录

时间:2009-04-16 03:26:12

标签: sql mysql limit

我有一张表可能有大约100条记录左右,并带有一个用户名字段。可能有许多具有相同用户名的记录。我如何确保每个用户名只返回一条记录,无论它是哪条记录?

e.g。对于下表

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

6 个答案:

答案 0 :(得分:4)

如果您 希望在结果中返回商品字段,则可以使用DISTINCT:

SELECT DISTINCT username,firstname,lastname FROM users

如果要包含项目字段,则必须执行以下操作:

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

使用这样的查询没有多大意义。你能更具体地了解一下你想要实现的目标吗?

答案 1 :(得分:3)

在MySQL 5中(你没有提到,但是你已经将这个问题标记为mysql,所以我假设)你可以:

SELECT *
FROM users
GROUP BY username

您将获得每个用户的任意行

请参阅Mysql Refman 11.11.3

  

MySQL扩展了GROUP BY的使用,以便您可以在SELECT列表中使用未出现在GROUP BY子句中的非聚合列或计算。 [...]如果您从GROUP BY部分省略的列在组中不是常量,请不要使用此功能。服务器可以自由地从组中返回任何值,因此除非所有值都相同,否则结果是不确定的。

实际上,考虑一下,你可能想要做

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

这将为您提供所有项目的列表。取决于你为什么想要那个任意行。

-----Ñ

答案 2 :(得分:1)

首先,应该构建和维护您的表,以便不会发生此状态。如初。

其次,我认为你想要的是SELECT DISTINCT

答案 3 :(得分:0)

SELECT DISTINCT username, item, firstname FROM users

答案 4 :(得分:0)

最好将用户名存储在名为users的表中,并使用名为user_id的唯一ID字段。

然后使用user_id作为foriegn密钥,将数据存储在与用户相关的表格中......例如购买,用户信息等。

答案 5 :(得分:0)

将用户名设为主键 - 这样,您就可以确保唯一性