1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

Подскажите идею как выбрать данные из БД

Тема в разделе "Web Coding", создана пользователем M_A_N, 20 апр 2007.

Статус темы:
Закрыта.
Модераторы: latteo
  1. M_A_N

    M_A_N Прохожие

    Приветствую, коллеги!

    Обозначилась у меня задачка найти в базе записи отвечающие запросу юзверя и сформировать линк на файл определенного вида. Когда в запросе одно слово (например: "WASHINGTON"), то проблем никаких. А вот как найти фразу никак не могу придумать при моей организации таблицы, которую изменить нельзя.

    Есть табличка вот такого вида:
    Код:
        "ID_STREAM";"ID_CHANNEL";"Time_marker"; "Content"
        ================================================
                "1";         "1";        "480";            "IN"
                "1";         "1";        "640";    "WASHINGTON"
                "1";         "1";       "1100";         "TODAY"
                "1";         "1";       "1390"; "CONGRESSIONAL"
                "1";         "1";       "1970";     "COMMITTEE"
                "1";         "1";       "2310";            "IS"
                "1";         "1";       "2420";          "BEEN"
                "1";         "1";       "2540";      "STUDYING"
                "1";         "1";       "3010";           "BAD"
                "1";         "1";       "3450";            "OR"
                "1";         "1";       "3730";         "WORSE"
                "1";         "1";       "4270";      "BEHAVIOR"
                "1";         "1";       "4940";            "IN"
                "1";         "1";       "5080";           "THE"
                "1";         "1";       "5310";           "AIR"
                "1";         "1";       "6100";            "BY"
                "1";         "1";       "6220";         "WHICH"
                "1";         "1";       "6430";            "TO"
                "1";         "1";       "6530";            "BE"
                "2";         "1";       "6670";            "IN"
                "2";         "1";       "6740";           "THE"
                "2";         "1";       "6860";  "INCREASINGLY"
                "2";         "1";       "7580";       "EVIDENT"
                "2";         "1";       "8010";       "PROBLEM"
                "2";         "1";       "8370";            "OF"
                "2";         "1";       "8540";       "AIRLINE"
                "2";         "1";       "9120";    "PASSENGERS"
                "2";         "1";       "9660";            "TO"
                "2";         "1";       "9760";           "GET"  
     
    К этой табличке в придачу есть еще две.
    Пусть запрос пользователя найти фразу "IN THE AIR"
    Делаю запрос к базе вида:

    PHP:
    SELECT asr_content_eng.*,
            
    asr_streams.*,
            
    asr_channels.*
      
    FROM asr_content_eng
      JOIN asr_streams ON
            asr_content_eng
    .ID_STREAM=asr_streams.ID_STREAM
      LEFT JOIN asr_channels ON
            asr_content_eng
    .ID_CHANNEL=asr_channels.ID_CHANNEL
      WHERE Content
    ="THE" or Content="AIR" or Content="IN"
      
    ORDER BY
            asr_content_eng
    .ID_CHANNEL,
            
    asr_content_eng.ID_STREAM,
            
    asr_content_eng.Time_marker
      LIMIT 0 
    30
    Получаю набор данных отсортированный по полям (ID_STREAM, ID_CHANNEL, Time_marker)
    Код:
        ID_STREAM ID_CHANNEL Time_marker Content StreamName     StreamDate
        ==================================================================
                1       1       480        IN    20070401.wav   1165854823
                1       1       4940       IN    20070401.wav   1165854823
                1       1       5080       THE   20070401.wav   1165854823
                1       1       5310       AIR   20070401.wav   1165854823
                1       1       6670       IN    20070401.wav   1165854823      
                1       1       10720      THE   20070401.wav   1165854823      
                1       1       13600      IN    20070401.wav   1165854823      
                1       1       28490      THE   20070401.wav   1165854823      
                1       1       34900      THE   20070401.wav   1165854823      
                1       1       37200      IN    20070401.wav   1165854823      
                1       1       37300      THE   20070401.wav   1165854823      
                2       1       179        THE   20070328.wav   1176148800      
                2       1       3390096    THE   20070328.wav   1176148800      
                2       1       6740965    THE   20070328.wav   1176148800  
     

    Вопрос: Каким макаром в этом наборе данных найти точно фразу "IN THE AIR" и
    состряпать ссылку на файл вида \\server\folder\20070401.wav?start=4940-1000end=5310+1000
    (значения start & end беруться из поля Time_Marker для Первого и Последнего слова в фразе -/+ 1000)

    Поясню, если бы слова писались предложениями или некими блоками в БД, то нет проблем найти вхождение строки поиска в поле Content (например: WHERE Content = 'IN THE AIR').
    А у меня то каждое слово в своей записи, единственное что их связывает - это временная метка (Time_marker).
    Грубо говоря, мне нужно выбрать данные по строке поиска ("IN THE AIR") где значения поля (Time_marker) для каждого слова в строке поиcка самые близкие друг к другу. При этом не допустимо выборка записей в иной последовательности слов от строки запроса. Надеюсь теперь понятно объяснил.
    Есть у меня предположение, что запросом к базе эту задачу не решить - надо в скрипте разбирать и анализировать полученые записи в массиве или еще как.
    Но вот как, что то никак не придумать.

    Пните меня в нужном направлении, пожалуйста!
    Может кто то решал подобную задачку, какие есть идеи?
     
  2. Nafania

    Nafania

    Регистр.:
    24 мар 2007
    Сообщения:
    167
    Симпатии:
    46
    Или три запроса (ну или там по кол-ву слов во фразе) или разбор ответа.
    Имхо, если кол-во слов будет большим, то база намного быстрее обработает n маленьких запросов, чем 1 но с кучей OR.
     
  3. M_A_N

    M_A_N Прохожие

    Да не проблема, количество запросов можно не считать :D
    Я выбрал данные (результат выборки в листинге после запроса в первом посте), которые могу засунуть в массив и уже с ним работать. Слова то в отдельных сточках сидят а не в одной. Если implode пройтись по массиву, то фразу то я отыщу, а вот как потом найти временные метки принадлежащие этим словам пока незнаю.
     
  4. Nafania

    Nafania

    Регистр.:
    24 мар 2007
    Сообщения:
    167
    Симпатии:
    46
    Примерно
    PHP:
    $new_ary = array();
    while ( 
    $row mysql_fetch_array($result) ) {
    $new_ary[$row['Time_marker']] = array(
      
    'ID_STREAM' => $row['ID_STREAM'],
      
    'ID_CHANNEL' => $row['ID_CHANNEL'],
      
    'Content' => $row['Content']
    );
    }
    И дальше работаете с массивом как вам угодно
    ЗЫ, поле Time_marker необязательно делать ключом массива.
     
  5. M_A_N

    M_A_N Прохожие

    Nafania
    Хорошая идея :ay: , спасибо - ценный прием. Буду пробовать.
     
  6. medvoodoo

    medvoodoo Постоялец

    Регистр.:
    28 мар 2007
    Сообщения:
    89
    Симпатии:
    19
    Это реально сделать одним запросом, используйте CONCAT
     
  7. M_A_N

    M_A_N Прохожие

    Я конечно извиняюсь, ну и как заюзать CONCAT с разными записями.
    Ну парни, ну ёптыть, ну я же не просто так сочинял первый пост на три скрина. Если чего непонятно - спрашивайте!

    Добавлено через 43 секунды
    сорри за резкость :eek:
     
  8. M_A_N

    M_A_N Прохожие

    Какие еще есть мысли, братцы выручайте!
     
  9. mixamixa

    mixamixa Постоялец

    Регистр.:
    9 янв 2007
    Сообщения:
    61
    Симпатии:
    13
    Так. я честно говоря не понимаю:
    как должны отличаться time_marker в словах IN,THE,AIR?
    мне кажется нужно сначала все таки завести в массив и делать свой хороший поиск, запросом тут проблему не решить.
    итак может ли быть, что у THE time marker меньше чем у IN.
    Могут ли быть разные ID , но очень близкий time_marker?
    напиши пожалуйста, и решить это я думаю не составит труда:)
    з.ы. и вообще что такое time_marker?какой в нем вселенский смысл?
     
  10. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Судя по всему time_marker - это UNIX-штамп времени, сделанный через TIME .
     
Статус темы:
Закрыта.