Не чёткий GROUP BY

Тема в разделе "Базы данных", создана пользователем o_nix, 13 фев 2011.

Модераторы: latteo
  1. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    есть вот такой вот запрос
    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 байт взятых из середины ???
     
  2. hotx

    hotx Постоялец

    Регистр.:
    6 май 2006
    Сообщения:
    71
    Симпатии:
    31
    Вложенный FULL TEXT SEARCH?
    А вобще, я бы реализовал через PHP, если из базы сразу вытаскивать с помощью SUBSTR середину нужного поля, а потом просто группировать полученный массив средствами PHP и считать количество.
     
  3. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    я вообще знаком с mysql поверхностно, что такое вложенный аператор FULL TEXT SEARCH ?? и как его вкладывать ?
    На сколько я понимаю он ищет по прямому вхождению?
    Тоесть чтобы им воспользоваться нада сначала из базы как то выдрать один элемент выбрать из него середину и потом только искать это значение по всей базе ??
    Всё это можно проделать чисто средствами MySQL без php??

    либо всёравно php обрабатывать данные будет ??
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    может добавить условие сравнения 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
     
    o_nix нравится это.
  5. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    polyetilen
    alt_name - вродебы самим двигом создаётся автоматом по post_name ... так зачем тогда сравнивать посути тоже самое ?? или всё хитрее ??

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

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

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

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

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

    то есть под 100% совпадение попадает 4 alt_name
    мне же нужно за счёт снижения порогового значения сходства до скажем 70%
    получить расширенный "круг подозреваемых" постов до 7-10
     
  6. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    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
    
    http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp
     
    o_nix нравится это.