Не чёткий GROUP BY

o_nix

Хранитель порядка
Регистрация
7 Ноя 2007
Сообщения
1.070
Реакции
1.063
есть вот такой вот запрос
PHP:
$sql = "SELECT *,count(*) as `post_counter`
        FROM `". PREFIX. "_post`
        GROUP BY `alt_name`
        ORDER BY `post_counter` DESC";
Он группирует записи по altname и если в группе получается более одной записи далее скрипт рубит все лишние как дубли

Но опеределят он как дубль при условии что совпадение текста в alt_name 100% - то есть даже если будет отличие всего в 1 байт дублем оно уже считаться не будет.

Как сделать "не чёткую" группировку ... то есть уйти от 100% совпадения ??

Можно ли как то ограничить сравнение данных из alt_name отбросив начало и конец значения а для сравнения выбрать допустим 20 байт взятых из середины ???
 
Вложенный FULL TEXT SEARCH?
А вобще, я бы реализовал через PHP, если из базы сразу вытаскивать с помощью SUBSTR середину нужного поля, а потом просто группировать полученный массив средствами PHP и считать количество.
 
я вообще знаком с mysql поверхностно, что такое вложенный аператор FULL TEXT SEARCH ?? и как его вкладывать ?
На сколько я понимаю он ищет по прямому вхождению?
Тоесть чтобы им воспользоваться нада сначала из базы как то выдрать один элемент выбрать из него середину и потом только искать это значение по всей базе ??
Всё это можно проделать чисто средствами MySQL без php??

либо всёравно php обрабатывать данные будет ??
 
может добавить условие сравнения LIKE
PHP:
$sql = "SELECT *,count(*) as `post_counter`
        FROM `". PREFIX. "_post`
        WHERE `post_name` LIKE '%a%'
        GROUP BY `alt_name`
        ORDER BY `post_counter` DESC";
возьмёт только post_name в которых есть буква a
 
polyetilen
alt_name - вродебы самим двигом создаётся автоматом по post_name ... так зачем тогда сравнивать посути тоже самое ?? или всё хитрее ??

щас чуть чуть погуглил
LIKE '%a%'

это типа сравнить по колличеству букв "а" или как ??

тоесть как регексп это ".*а.*"
так получается или как ??

просто % - нашёл любое колличество символов а вот "а" что то не нашёл такого ....

=============================================================
возьмёт только post_name в которых есть буква a

но веть это сузит "круг подозреваемых" на дубли постов а у меня задача обратная - расширить его ...
или я что то не так понял ??

то есть под 100% совпадение попадает 4 alt_name
мне же нужно за счёт снижения порогового значения сходства до скажем 70%
получить расширенный "круг подозреваемых" постов до 7-10
 
WHERE - где
`post_name` - поле post_name, значение которого надо сравнить
LIKE - похоже
'%слово%' - на значение %слово%, где слово это слово которое надо найти

% значит любой символ, если надо от начала тогда 'a%'

и найдёт все поля где будет слово, и не обязательно должен весь текст совпадать.

Но групировать всё равно будет по точным совпадениям, тогда если не подходит такое групирование то можно изменять групирование через HAVING

Код:
SELECT post_title
FROM wp_posts
GROUP BY post_name HAVING post_title LIKE '%форум%'
тут сгрупирует по post_name и возьмёт только группы где есть слово форум в поле post_title, это скорее фильтр чем расширение группы.

Или создавать свои поля по которым потом группировать
Код:
SELECT post_title, post_title REGEXP 'форум' group_1
FROM wp_posts
GROUP BY group_1
тут сгруппирует по полю group_1 в котором 1 когда в post_title по регулярке есть форум и 0 когда нет, дальше сгрупирует по group_1 и будет две группы.

Так и дальше можно расширять и составлять разные группы
Код:
SELECT post_title, post_title REGEXP 'Фор' group_1, post_title REGEXP 'ум' group_2
FROM wp_posts
GROUP BY group_1, group_2
тут две группы, в одной есть и 'Фор' и 'ум', а в другой этих слов нет.

regexp зависит от регистра букв так что можно перевести в одинаковый регист перед сравнением
Код:
SELECT post_title, LOWER(post_title) REGEXP LOWER('ФОруМ')
FROM wp_posts
 
Назад
Сверху