Как с помощью 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), однако это можно организовать с помощью переменных в запросе. В два этапа: сначала пронумеровать строки в каждой группе, потом найти максимум номера в группе.
Комментариев нет:
Отправить комментарий