SQL ограничение для уникальных записей - PullRequest
0 голосов
/ 16 апреля 2009

У меня есть таблица, которая может иметь около 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

Ответы [ 6 ]

4 голосов
/ 16 апреля 2009

Вы можете использовать DISTINCT, если вы не хотите вернуть поле элемента в ваших результатах:

ВЫБЕРИТЕ 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

Использование такого запроса не имеет особого смысла. Не могли бы вы рассказать немного о том, чего вы пытаетесь достичь?

3 голосов
/ 16 апреля 2009

В 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

Что даст вам список всех их предметов. Зависит от того, почему вы хотели эту произвольную строку.

----- Н

1 голос
/ 16 апреля 2009

Прежде всего, ваша таблица должна быть построена и поддерживаться так, чтобы это состояние не возникало. Когда-либо.

Во-вторых, я думаю, что вы хотите SELECT DISTINCT.

0 голосов
/ 16 апреля 2009

Сделайте имя пользователя вашим первичным ключом - таким образом, вы можете обеспечить уникальность

0 голосов
/ 16 апреля 2009

Будет лучше, если вы сохраните имя пользователя в таблице с именем users и будете использовать уникальное поле id с именем user_id.

Затем используйте user_id в качестве внешнего ключа для хранения данных в таблицах, связанных с пользователем ... например, покупки, информация о пользователе и т. Д.

0 голосов
/ 16 апреля 2009
SELECT DISTINCT username, item, firstname FROM users
...