2013-04-27 1 views
5

Похоже, что мы могли бы иметь некоторые повторяющиеся значения в нашей таблице предпочтений , поэтому я хочу удалить все повторяющиеся записи для каждого пользователя,. Я потратил довольно много времени, пытаясь придумать решение, и я просто продолжаю кругами. Я пробовал макс, сгруппировал его, подзапросы и т. Д. Очень легко удалить самые высокие, но не все, но самые высокие. И специально для каждого пользователяSQL - удалите все дубликаты, но самые высокие из каждой группы для каждого пользователя ID

Таким образом, в базе данных я мог бы:

id : name:  value : userId 
1 : sortOrder: Asc  : 1 
2 : sortOrder: Desc : 1 
3 : sortOrder: Asc  : 2 
4 : something: value2 : 1 

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

Так что я знаю, что это по крайней мере подзапрос с группой, но я просто не могу понять это. До сих пор у меня есть:

SELECT 
    MAX(id), 
    name 
FROM 
    preference 
GROUP BY 
    name 

, который дает мне список тех, кого я хочу сохранить, НО он все еще скучает для каждого пользователя. Поэтому я немного хочу иметь обратное, если бы у меня было это для каждого пользователя. Однако я не верю, что могу использовать <> в подзапросе.

В конечном итоге я хочу удалить все те, у которых более низкий идентификатор для одного и того же пользователя, которые являются дублирующими элементами.

+1

GROUP BY userID также, если вы хотите этого на пользователя. – Scotch

ответ

8

Один из способов, при условии, Id столбца является уникальным Id:

DELETE FROM preference 
where Id NOT IN (SELECT MAX(id) FROM preference GROUP BY name, userId) 

[Примечание: применяется обычный совет. не запустить в производство без тестирования первый]

Первый тест с:

SELECT * FROM preference 
where Id NOT IN (SELECT MAX(id) FROM preference GROUP BY name, userId) 

SQLFiddle является here. Работает по назначению. Я предлагаю тестирование с большим набором данных, хотя ...

+0

Запуск удаления без предварительной игры с выбором - это просто запрос на неприятности;) –

+1

, поэтому я упомянул об этом. –

+0

Это то, чего я не хватал NOT IN и второй группы. Не знал, что вы можете сделать вторую группу в одном и том же выборе. Спасибо :) –

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