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

Статус
В этой теме нельзя размещать новые ответы.
M

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ка самые близкие друг к другу. При этом не допустимо выборка записей в иной последовательности слов от строки запроса. Надеюсь теперь понятно объяснил.
Есть у меня предположение, что запросом к базе эту задачу не решить - надо в скрипте разбирать и анализировать полученые записи в массиве или еще как.
Но вот как, что то никак не придумать.

Пните меня в нужном направлении, пожалуйста!
Может кто то решал подобную задачку, какие есть идеи?
 
Или три запроса (ну или там по кол-ву слов во фразе) или разбор ответа.
Имхо, если кол-во слов будет большим, то база намного быстрее обработает n маленьких запросов, чем 1 но с кучей OR.
 
Да не проблема, количество запросов можно не считать :D
Я выбрал данные (результат выборки в листинге после запроса в первом посте), которые могу засунуть в массив и уже с ним работать. Слова то в отдельных сточках сидят а не в одной. Если implode пройтись по массиву, то фразу то я отыщу, а вот как потом найти временные метки принадлежащие этим словам пока незнаю.
 
Примерно
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 необязательно делать ключом массива.
 
Nafania
Хорошая идея :ay: , спасибо - ценный прием. Буду пробовать.
 
Это реально сделать одним запросом, используйте CONCAT
 
Я конечно извиняюсь, ну и как заюзать CONCAT с разными записями.
Ну парни, ну ёптыть, ну я же не просто так сочинял первый пост на три скрина. Если чего непонятно - спрашивайте!

Добавлено через 43 секунды
сорри за резкость :eek:
 
Какие еще есть мысли, братцы выручайте!
 
Так. я честно говоря не понимаю:
как должны отличаться time_marker в словах IN,THE,AIR?
мне кажется нужно сначала все таки завести в массив и делать свой хороший поиск, запросом тут проблему не решить.
итак может ли быть, что у THE time marker меньше чем у IN.
Могут ли быть разные ID , но очень близкий time_marker?
напиши пожалуйста, и решить это я думаю не составит труда:)
з.ы. и вообще что такое time_marker?какой в нем вселенский смысл?
 
Судя по всему time_marker - это UNIX-штамп времени, сделанный через TIME .
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху