Нужен запрос без подзапроса - MySQL
Формулировка задачи:
Использую вот такой запрос чтобы узнать 'id' все повторяющихся значений в столбце 'ru'
SELECT `id` , `ru` FROM `table` WHERE `ru` IN (SELECT `ru` FROM `table` GROUP BY `ru` HAVING count(*)>1);
При количестве записей 1000 штук, запрос занимает 16 сек, но записей будет намного больше.
Подскажите есть ли более быстрый способ получить id все повторяющизся значений средствами MySql?
Например
------------------
¦ id ¦ ru ¦
------------------
¦ 1 ¦ Вася ¦
------------------
¦ 2 ¦ Вася ¦
------------------
¦ 3 ¦ Миша ¦
------------------
¦ 4 ¦ Олег ¦
------------------
¦ 5 ¦ Олег ¦
------------------
Нужно получить
1 Вася
2 Вася
4 Олег
5 Олег
Решение задачи: «Нужен запрос без подзапроса»
textual
Листинг программы
SELECT GROUP_CONCAT(id) AS ids , ru, COUNT(*) AS cnt FROM `table1` GROUP BY ru HAVING cnt > 1
Объяснение кода листинга программы
SELECT- оператор выбора данных из базы данных.GROUP_CONCAT(id)- функция агрегирования, которая объединяет значения столбцаidв одну строку, разделенную запятыми.AS- оператор присвоения псевдонима для вычисляемого столбца.ids- псевдоним для вычисляемого столбца, содержащего объединенные значенияid.ru- название столбца, содержащего данные, которые будут группироваться.COUNT(*)- функция агрегирования, которая подсчитывает количество строк в каждой группе.cnt- псевдоним для вычисляемого столбца, содержащего количество строк в каждой группе.FROM- оператор указания источника данных.table1- название таблицы, из которой берутся данные.GROUP BY- оператор группировки строк по указанному столбцу.ru- название столбца, по которому происходит группировка.HAVING- оператор фильтрации результатов агрегирования.cnt > 1- условие, которое оставляет только те группы, в которых количество строк больше одного.ORDER BY- оператор сортировки результатов запроса.ru- название столбца, по которому происходит сортировка.DESC- направление сортировки - по убыванию.LIMIT- оператор ограничения количества возвращаемых строк.20- максимальное количество строк, которые будут возвращены.OFFSET- оператор пропуска первых указанных строк.0- количество строк, которые будут пропущены.