За последние 24 часа нас посетили 18832 программиста и 1606 роботов. Сейчас ищет 1171 программист ...

Поиск со строки xfields

Тема в разделе "MySQL", создана пользователем Nurdaulet, 23 фев 2013.

  1. Nurdaulet

    Nurdaulet Активный пользователь

    С нами с:
    23 фев 2013
    Сообщения:
    6
    Симпатии:
    0
    Здравствуйте! Прошу помочь.
    Делаю запрос на БД
    Код (Text):
    1.             if ($cstart) {
    2.                 $cstart = $cstart - 1;
    3.                 $cstart = $cstart * $config['news_number'];
    4.             }
    5.  
    6.             $newsmodule = true;
    7.  
    8.             $xf = urldecode ( $_GET['xf'] );
    9.  
    10.             if ( $config['charset'] == "windows-1251" AND $config['charset'] != detect_encoding($xf) ) {
    11.                 $xf = iconv( "UTF-8", "windows-1251//IGNORE", $xf );
    12.             }
    13.  
    14.             $xf = @$db->safesql ( htmlspecialchars ( strip_tags ( stripslashes ( trim ( $xf ) ) ), ENT_QUOTES ) );
    15.             $url_page = $config['http_home_url'] . "actors/" . urlencode ( str_replace("'", "'", $xf) );
    16.             $user_query = "do=actors&xf=" . urlencode ( str_replace("'", "'", $xf) );
    17.        
    18.             if (isset ( $_SESSION['dle_sort_actors'] )) $news_sort_by = $_SESSION['dle_sort_actors'];
    19.             if (isset ( $_SESSION['dle_direction_actors'] )) $news_direction_by = $_SESSION['dle_direction_actors'];
    20.            
    21.             $sql_select = "SELECT SQL_CALC_FOUND_ROWS p.id, p.autor, p.date, p.short_story, SUBSTRING(p.full_story, 1, 15) as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) WHERE {$stop_list}xfields LIKE '%{$xf}%' AND approve=1" . $where_date . " ORDER BY " . $news_sort_by . " " . $news_direction_by . " LIMIT " . $cstart . "," . $config['news_number'];
    22.             $sql_count = "SELECT FOUND_ROWS() as count";
    23.             $allow_active_news = true;
    БД в строке xfields такие значения
    Код (Text):
    1. ||title|Chronicle
    2. ||quality|HDRip
    3. ||year|2012
    4. ||country|США
    5. ||director|Джошуа Транк
    6. ||actors|Майкл Б. Джордан, Майкл Келли, Дэйн ДеХаан, Анна Вуд, Эшли Хиншоу, Алекс Расселл, Хосе Ваз, Люк Стейн, Мэттью Робертс
    7. ||time|83 мин.
    при запросе помощью LIKE '%{$xf}%'
    например /actors/Майкл+Келли показывает тот материал котором есть актер Майкл Келли, но если написать так /actors/США то показывает материалы котором есть страна, то он ищет с xfields а не внутри xfields [actors], так что не стандартно такое. Вот бы хотел спросить как сделать что бы LIKE '%{$xf}%' искал с строки [actors]. Прошу помочь
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    сделать отдельную таблицу для этого, а не держать в строке.
     
  3. Nurdaulet

    Nurdaulet Активный пользователь

    С нами с:
    23 фев 2013
    Сообщения:
    6
    Симпатии:
    0
    Это невозможно, так как если создать новую таблицу то это потеряет весь смысл. Хотел сделать с этого. А возможно получить то что ищу из строки?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    давайте вы слегка расслабитесь, не будете пугаться. =) тут всё просто. Вы можете жить с той штукой что у вас есть сейчас, если вы студент и должны сдать диплом на троечку. Если эта программа у вас создаётся из расчёта реального применения, то иного выхода, кроме как сделать отдельную таблицу у вас нет.

    Это очень просто. Скажите сначала, какая реальная задача этого проекта: сдали забыл, или должно работать и радовать людей?
     
  5. Nurdaulet

    Nurdaulet Активный пользователь

    С нами с:
    23 фев 2013
    Сообщения:
    6
    Симпатии:
    0
    Извините, но я еще школьник и по этому и спрашиваю)) Сдать и забыть не люблю, да и бесполезно было бы его сделать, а радовать людей вот что хочу, но еще не получается.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если у вас будут такие данные (это вы из сами туда в таком виде понапихали?), то чтобы сделать выборку, серверу базы данных надо будет прочесть каждую строку, посмотреть что там, провести поиск, решить, включать ли строку в выборку. Это фатально для производительности, и выборки вы строить толком не сможете.

    нужно поступить так. Выносите всё это дело в таблицу типа
    №фильма, имя параметра, значение параметра

    и когда вам надо найти все фильмы американского производства, вы делаете запрос типа SELECT `номер_фильма` WHERE `имя_параметра` = 'country' AND `значение_параметра` = 'США'
    Вы получили все айдишники киношек, и следующим запросом (или джоином) выбираете все эти киношки.

    принцип ясен?
     
  7. Nurdaulet

    Nurdaulet Активный пользователь

    С нами с:
    23 фев 2013
    Сообщения:
    6
    Симпатии:
    0
    Нет. Это дополнительные поля создаваемой движком, оказывается данные в полях впихивает в одну таблицу. Что потом перенести их в другую таблицу не возможен.
    Это значить отбор из xfields [actors] не возможен? Кроме как создать таблицу нет выхода?
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    возможен. только это скорее всего вызовет зависоны при реальных нагрузках.
     
  9. Nurdaulet

    Nurdaulet Активный пользователь

    С нами с:
    23 фев 2013
    Сообщения:
    6
    Симпатии:
    0
    Если хостов (около 10000) будет много то сайт не выдержит?
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Зависит от размера базы и частоты поисковых запросов. Ну и от сервера.

    В любом случае даже единичный поиск будет очень долгим. Надо тестировать.
     
  11. Nurdaulet

    Nurdaulet Активный пользователь

    С нами с:
    23 фев 2013
    Сообщения:
    6
    Симпатии:
    0
    Да уж. Спасибо что уделили свое время!))
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    базы данных не просто там что-то в себе хранят и шарятся по куче строк. Они работают быстро, если построены индексы. Это как содержание в книге. Некоторые запросы способны выполняться без заглядывания в таблицу, одними только индексами. Но если нет - индексы очень помогают найти те строки, которые надо проверить. В твоём случае любой запрос будет вызвать полное чтение по-буквам всей таблицы каждый раз. =)