1

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

例如下表

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
4

6 回答 6

6

如果您不想在结果中返回 item 字段,则可以使用DISTINCT

从用户中选择不同的用户名、名字、姓氏

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

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

使用这样的查询没有多大意义。您能否更具体地说明您要实现的目标?

于 2009-04-16T03:33:44.827 回答
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

这将为您提供他们所有项目的列表。取决于您首先想要任意行的原因。

-----N

于 2009-04-16T03:59:24.280 回答
1

首先,应该构建和维护您的表,以使这种状态不会发生。曾经。

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

于 2009-04-16T03:29:44.930 回答
0
SELECT DISTINCT username, item, firstname FROM users
于 2009-04-16T03:29:11.013 回答
0

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

然后使用 user_id 作为外键将数据存储在与用户相关的表中……例如购买、用户信息等。

于 2009-04-16T03:34:14.997 回答
0

使用户名成为您的主键 - 这样,您可以确保唯一性

于 2009-04-16T03:36:27.207 回答