Не везде выполняются запросы к базе

Тема в разделе "Базы данных", создана пользователем yura, 3 янв 2016.

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

    yura

    Регистр.:
    6 апр 2006
    Сообщения:
    437
    Симпатии:
    65
    Всем привет!

    У меня проблема с ДЛЕ и его базой. Ранее я уже создавал тему в разделе по ДЛЕ ( https://www.nulled.cc/threads/270203/ ) однако там пришли к выводу, что с самим ДЛЕ все ОК и проблема в базе...

    Проблема в том, что в некоторых новостях не выводятся похожие новости. Айди похожих новостей ДЛЕ хранит в поле related_ids таблицы dle_post_extras. При очистке кеша похожих новостей в админке все поля с айди похожих новостей очищаются. Когда же пользователь заходит в новость - ДЛЕ отправляет в базу запрос есть ли что-то в поле related_ids. Если нет - в него вписываются айди похожих новостей.

    НО... Вписываются они не всегда :( По личным наблюдениям проблема присуща в основном "старым" новостями либо новым новостям из старых категорий. Дело в том, что сайту примерно 8 лет и первоначально он создавался еще на ДЛЕ версий 7.х после чего постепенно обновлялся до 10.х. Грешу на то, что при всех этих обновлениях в базе что-то "нарушилось".

    Включал логирование мускула. Фрагмент с лога при котором похожие новости не вписались
    Код:
      140 Connect dle_user@localhost on base
        140 Query SET NAMES 'cp1251'
        140 Query SELECT category FROM dle_post where  id = '3121' AND approve
        140 Query SELECT * FROM dle_users WHERE user_id='1'
        140 Query SELECT * FROM dle_post LEFT JOIN dle_post_extras ON (dle_post.id=dle_post_extras.news_id) WHERE  id = '3121'
        140 Query UPDATE dle_post_extras SET news_read=news_read+1 WHERE news_id='3121'
        140 Query SELECT id, date, short_story, xfields, title, category, alt_name FROM dle_post WHERE category regexp '[[:<:]](272)[[:>:]]' AND MATCH (title, short_story, full_story, xfields) AGAINST ('ТАЙТЛ НОВОСТИ ') AND id != 3121 AND approve=1 AND date < '2015-12-26 20:22:23' LIMIT 4
        140 Quit 
    А тут все вписалось
    Код:
         89 Connect db_user@localhost on base
         89 Query SET NAMES 'cp1251'
         89 Query SELECT category FROM dle_post where  id = '830' AND approve
         89 Query SELECT * FROM dle_post LEFT JOIN dle_post_extras ON (dle_post.id=dle_post_extras.news_id) WHERE  id = '830'
         89 Query UPDATE dle_post_extras SET news_read=news_read+1 WHERE news_id='830'
         89 Query SELECT id, date, short_story, xfields, title, category, alt_name FROM dle_post WHERE category regexp '[[:<:]](137)[[:>:]]' AND MATCH (title, short_story, full_story, xfields) AGAINST ('Tuning Ford Focus Tuning Ford Focus ST') AND id != 830 AND approve=1 AND date < '2015-12-26 20:21:58' LIMIT 4
         89 Query UPDATE dle_post_extras SET related_ids='836,837,835,832' WHERE news_id='830'
         89 Quit
    Выполнил в пхпмайадмин запрос который вписывает айди похожих
    Код:
    UPDATE dle_post_extras SET related_ids='4,5,7,8' WHERE news_id='6'
    Вписалось.
    Выполнил еще такой запрос
    Код:
    SELECT id, date, short_story, xfields, title, category, alt_name FROM dle_post WHERE category regexp '[[:<:]](272)[[:>:]]' AND MATCH (title, short_story, full_story, xfields) AGAINST ('ТАЙТЛ НОВОСТИ ') AND id != 3121 AND approve=1 AND date < '2015-12-26 20:22:23' LIMIT 4
    Пустой результат, т.е. ноль строк. Новости с айди 3121 и 6, о которых упоминалось в запросах, как раз из числа проблемных где похожие новости не выводятся.

    Помогите пожалуйста. Куда копать?
     
  2. Bezhev

    Bezhev

    Регистр.:
    26 дек 2012
    Сообщения:
    362
    Симпатии:
    123
    а что подставляется, по коду там где 272? id?

    ну и как вариант, попробуй удалить:
    Код:
    category regexp '[[:<:]](272)[[:>:]]' AND
    Думаю что проблема в этой строке, не понимаю почему регуляркой по id категории ищется.

    Без регэскпа должен искать по всем категориям
     
  3. yura

    yura

    Регистр.:
    6 апр 2006
    Сообщения:
    437
    Симпатии:
    65
    272 это айди категории. В настройках ДЛЕ включен выбор похожих новостей из той-же категории, что и сама новость.
     
  4. Bezhev

    Bezhev

    Регистр.:
    26 дек 2012
    Сообщения:
    362
    Симпатии:
    123
    тогда я не понимаю зачем там regexp, почему не сделать более быстрый:
    Код:
    WHERE category=272 AND MATCH ...
    ?
     
  5. yura

    yura

    Регистр.:
    6 апр 2006
    Сообщения:
    437
    Симпатии:
    65
    Эм... поищу какой код генерит этот запрос и попробую..

    Все равно не понятно почему не работает только в некоторых новостях... А в остальных (% наверное 80-90) все ок
     
  6. yura

    yura

    Регистр.:
    6 апр 2006
    Сообщения:
    437
    Симпатии:
    65
    Подправил чуть код ДЛЕ. Теперь в логах когда все ок такое
    Код:
          120 Connect    dle_user@localhost on dle
              120 Query    SET NAMES 'cp1251'
              120 Query    SELECT category FROM dle_post where  id = '3225' AND approve
              120 Query    SELECT * FROM dle_post LEFT JOIN dle_post_extras ON (dle_post.id=dle_post_extras.news_id) WHERE  id = '3225'
              120 Query    UPDATE dle_post_extras SET news_read=news_read+1 WHERE news_id='3225'
              120 Query    SELECT id, date, short_story, xfields, title, category, alt_name FROM dle_post WHERE id IN(3104,3103,3222,3194) ORDER BY id DESC
              120 Quit    
    А когда все не ок такое
    Код:
               31 Connect    dle_user@localhost on dle
               31 Query    SET NAMES 'cp1251'
               31 Query    SELECT category FROM dle_post where  id = '6' AND approve
               31 Query    SELECT * FROM dle_users WHERE user_id='1'
               31 Query    SELECT * FROM dle_post LEFT JOIN dle_post_extras ON (dle_post.id=dle_post_extras.news_id) WHERE  id = '6'
               31 Query    UPDATE dle_post_extras SET news_read=news_read+1 WHERE news_id='6'
               31 Query    SELECT id, date, short_story, xfields, title, category, alt_name FROM dle_post WHERE category=41 AND MATCH (title, short_story, full_story, xfields) AGAINST ('ТАЙТЛ') AND id != 6 AND approve=1 AND date < '2016-01-05 03:56:41' LIMIT 4
               31 Quit    
    Т.е. в плане результата не поменялось ровным счетом ничего
     
  7. Bezhev

    Bezhev

    Регистр.:
    26 дек 2012
    Сообщения:
    362
    Симпатии:
    123
    получается так, то что у тебя в AGAINST - тайтл, и видимо, нет совпадений по словам. Если тайтл состоит из нескольких слов, то поищите лайком, есть ли у тебя посты с такими словами

    если есть желание - скинь дамп таблицы dle_post, если нет, то почитай: http://www.mysql.ru/docs/man/Fulltext_Search.html
     
  8. yura

    yura

    Регистр.:
    6 апр 2006
    Сообщения:
    437
    Симпатии:
    65
    Тайтл я менял перед тем как постить сюда...

    В базе примерно 3500 новостей. Нужна вся база или примеры с похожими новостями и без?
     
  9. Bezhev

    Bezhev

    Регистр.:
    26 дек 2012
    Сообщения:
    362
    Симпатии:
    123
    это я понимаю)
    нужна только одна таблица dle_post
     
  10. yura

    yura

    Регистр.:
    6 апр 2006
    Сообщения:
    437
    Симпатии:
    65
    Вся таблица со всеми новостями или достаточно по несколько примеров у которых все ок и у которых не ок?