Страницы

Поиск по вопросам

четверг, 10 января 2019 г.

Mysql найти записи которые имеют одинаковое значение поля до определенного символа

Как с помощью mysql найти записи которые имеют одинаковое значение поля до определенного символа?
Пример:
[id] [value] 0 11#1 1 12#44 2 11#12
Вывод:
[id] [value] 0 11#1 2 11#12
Символ конечно будет другой, как и другая структура таблицы.


Ответ

не совсем понятно что вы имеете ввиду. Какой должен быть результат, например, на таких данных:
id value 0 111#12313 1 22#fdsasd 2 22#qweert 3 33333#qwertrewq 4 111#werwr 5 22#qqqq 6 qweqweqw
Вот запрос, который подсчитывает для каждой строки количество повторений подстроки до символа #:
SELECT * FROM ( SELECT SUBSTR(value, 1, INSTR(value, '#')-1) as pref, COUNT(*) as cnt FROM tablename WHERE INSTR(value, '#') > 0 GROUP BY SUBSTR(value, 1, INSTR(value, '#')-1) /*HAVING COUNT(*) > 1*/ )T1 JOIN tablename T2 ON value LIKE CONCAT(pref, '#%')
На приведённых выше данных запрос выдаст:
id value pref cnt 0 111#12313 111 2 1 22#fdsasd 22 3 2 22#qweert 22 3 3 33333#qwertrewq 33333 1 4 111#werwr 111 2 5 22#qqqq 22 3
Если раскоментировать /*HAVING COUNT(*) > 1*/- то запрос выведет только те строки, префикс у которых неуникальный(повторяется как минимуму один раз).
UPD: условие соединения заменил на value LIKE CONCAT(pref, '#%'), чтобы при наличии индекса по value - он использовался.
При желании можно вообще обойтись без двух чтений из таблицы talename. В MySQL нет функции COUNT(*)OVER(PARTITION BY), однако это можно организовать с помощью переменных в запросе. В два этапа: сначала пронумеровать строки в каждой группе, потом найти максимум номера в группе.

Комментариев нет:

Отправить комментарий