2009-04-16 5 views
0

У меня есть таблица, которая может иметь около 100 записей или около того, с полем имени пользователя. Там может быть много записей с одинаковым именем пользователя. Как я могу гарантировать, что возвращается только одна запись для каждого имени пользователя, независимо от того, какая запись это?sql limit для уникальных записей

например. для следующей таблице

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

1

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

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

+0

Почему? Возможно, в его заявлении совершенно естественно, что существуют дублирующие «имена пользователей» –

+0

Если это так, то почему он хочет вернуть уникальный список и отменить случайные записи? –

+0

База данных не выглядит нормализованной. Его имена пользователей явно должны быть уникальными (они соответствуют тем же самым первым и последним именам в каждой строке). – Calvin

4

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

SELECT DISTINCT имени пользователя, Firstname, Lastname от пользователей

Если вы хотите включить в поле элемента, вам нужно будет сделать что-то вроде этого:

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

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

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

0

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

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

+0

Это очень здорово, не знал, что у MySQL это было. –

+0

Я подозреваю, что вы правы, хотя и это поведение не может быть тем, что они хотят сделать! – NickZoic

 Смежные вопросы

  • Нет связанных вопросов^_^