Выберите только строки, которые не являются уникальными [MySQL]

0

Я пытаюсь сделать запрос, который будет проверять наличие дубликатов, и если я найду дубликаты, я хочу иметь возможность обновлять их соответствующим образом. Например, у меня есть следующий набор данных, как выбрать только 2 строки, которые имеют одинаковое значение для 'position'?

ID          position
1           0
2           1
3           2
4           1
5           3

В этом примере я бы выбрал только строки 2 и 4.

Теги:
aggregate-functions

3 ответа

3
Лучший ответ
SELECT t.position, 
    count(t.*) AS count 
FROM table t
GROUP BY position 
HAVING count(position) > 1

Должен возвращать список позиций и их количество повторений.

Изменить: игнорируется псевдоним моей таблицы

Если вы хотите увидеть строки, которые имеют повторяющиеся позиции, попробуйте:

SELECT t1.ID,
    t1.position,
    t2.ID,
    t2.position
FROM table t1
INNER JOIN table t2
    ON t1.ID < t2.ID
    AND t1.position = t2.position

Это даст вам набор строк (4 столбца), где есть дубликаты. Вы получите 1 строку для дубликата, 3 для тройки, 6 для квадроцикла и увеличится с этой точки.

0

Чтобы немного рассказать о ответе Matt S (это правильно), вы можете использовать его результаты и присоединиться к исходной таблице, чтобы получить точные строки:

select
    id
    ,position
from table t
    join (
        select t1.position
        from table t1
        group by t1.position
        having count(*) > 1
    ) list
    on t.position = list.position

Использование функции CTE или EXISTS() в предложении WHERE сделает это немного легче для чтения, но я не знаю, что MySQL синтаксически поддерживает (я парень T-SQL:)). Это должно быть ANSI.

0

Ответ Matt S - это то, как вы обычно получаете то, что ищете. Чтобы немного расширить ответ на scottE (и поскольку мы говорим о MySQL), вы также можете использовать group_concat(), чтобы собрать всю информацию, которую вы ищете, если результат приятный.

SELECT group_concat(ID) as 'IDs', position
FROM table
GROUP BY position
HAVING count(position) > 1

должен вернуть вас:

идентификаторы   |   положение
2, 4   |   1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню