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

Статус
В этой теме нельзя размещать новые ответы.
mixamixa
Все очень просто:
Time_marker - это время в милисекундах от начала файла (или потока), которое соответсвует слову в поле Content.
(короче, что то типа субтитров к видеофайлу)
ID_STREAM - это поток или отдельный файл.
Конечно возможна ситуация когда Time_marker будет одинаков для разных записей в таблице, но только при условии, что это разные потоки. Внутри одного потока не может быть двух одинаковых Time_marker.
Вся фишка в том, что каждому слову в таблице есть свой Time_marker и ID_STREAM. Допустим нам надо найти фразу "INTERNET WILL SHOW". Запросом к базе типа
PHP:
WHERE Content in ('INTERNET', 'WILL', 'SHOW')
мы вытаскиваем все записи, в которых присутствует одно из слов фразы поиска, попутно мы их можем отсортировать по ID_STREAM и Time_marker. Далее засасываем выборку в массив.
Далее ВНИМАНИЕ!!! нам надо найти три записи, в которых слова идут в правильном порядке, т.е.
----------------------------------
Time_marker[первого слова] < Time_marker[второго слова] < Time_marker[третьего слова] при ID_STREAM одинаковом у всех трех.
----------------------------------
Ну и конечно же, количество слов в фразе поиска не ограничено тремя. Понятно, что фраза поиска может состоять из одного слова или целого предложения.
Вроде все объяснил, но если что спрашивай :ay:
 
Я попытался написать код)))сразу скажу , что писал в лоб. красивое решение еще ищу)))если помогло можно кликнуть на кнопку спасибо))
Код:
<?php
$mas[0]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>480,'content'=>'IN');
$mas[1]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>4940,'content'=>'IN');
$mas[2]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>5080,'content'=>'THE');
$mas[3]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>5310,'content'=>'AIR');
$mas[4]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>6670,'content'=>'THE');
$mas[5]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>10720,'content'=>'THE');
$mas[6]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>13600,'content'=>'IN');
$mas[7]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>28490,'content'=>'THE');
$mas[8]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>34900,'content'=>'THE');
$mas[9]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>37200,'content'=>'IN');
$mas[10]=array('id_stream'=>1,'id_channel'=>1,'time_marker'=>37300,'content'=>'THE');
$mas[11]=array('id_stream'=>2,'id_channel'=>1,'time_marker'=>179,'content'=>'IN');
$mas[12]=array('id_stream'=>2,'id_channel'=>1,'time_marker'=>3390096,'content'=>'THE');
$mas[13]=array('id_stream'=>2,'id_channel'=>1,'time_marker'=>6740965,'content'=>'AIR');
$massivwords=explode(" ","IN THE AIR");
$current_id=$mas[0]['id_stream'];
$currentidfindword=0;
$currentfindword=$massivwords[$currentidfindword];
$idstack=0;
$stack[$idstack]=array();
for($i=0;$i<count($mas);$i++)
{	
	$new_id=$mas[$i]['id_stream'];
	if ($new_id==$current_id)	
	{
		//мы находимся в том же потоке
		if ($mas[$i]['content']==$currentfindword)
		{
			$stack[$idstack][]=$i;
			if ($currentidfindword+1<count($massivwords))$currentidfindword++;
			   else {
			   	$idstack++;
			   }
			$currentfindword=$massivwords[$currentidfindword];							
		} else 
		{
			$stack[$idstack]=array();
			$currentidfindword=0;
			$currentfindword=$massivwords[0];	
			if ($mas[$i]['content']==$currentfindword)
			{
				$stack[$idstack][]=$i;
				if ($currentidfindword+1<count($massivwords))$currentidfindword++;
				   else $idstack++;
				$currentfindword=$massivwords[$currentidfindword];							
			}												
		}
	} else 
	{
		//новый поток
			$currentidfindword=0;
			$currentfindword=$massivwords[$currentidfindword];							
		if ($mas[$i]['content']==$currentfindword)
		{
			$stack[$idstack]=array(); //очищаем $stack[$idstack]
			$stack[$idstack][]=$i;
			if ($currentidfindword+1<count($massivwords))$currentidfindword++;
			   else $idstack++;
			$currentfindword=$massivwords[$currentidfindword];							
		}
			$current_id=$new_id;
	}
}
//последняя запись в стэк может быть не полной. если неполная удаляем
$id=count($stack)-1;if (count($stack[$id])!=count($massivwords)) unset($stack[$id]);
/*
сформировали массив stack
в таком виде
$stack[0]  //количество найденных совпадений
$stack[1]
...
$stack[0][0]  //id записи в массиве mas 1 слова 1 совпадения 
$stack[2][1]  //id записи в массиве mas 2 слова 3 совпадения 
$mas[$stack[0][0]]['time_marker']  //timemarker 1 слова 1 совпадения
*/

echo 'Найдено '.count($stack).' совпадения!!';
for($i=0;$i<count($stack);$i++)
{
	echo '<br>';
	echo 'запись где начало = '.$stack[$i][0].' time_marker этой записи '.$mas[$stack[$i][0]]['time_marker'].'<br>';
	echo 'запись где конец = '.$stack[$i][count($stack[$i])-1].' time_marker этой записи '.$mas[$stack[$i][count($stack[$i])-1]]['time_marker'].'<br>';
}

?>
пример выдает , что найдено два совпадения))в 1 и 2 потоке.
по идее пример выдаст вообще все совпадения какие найдет.
Но протестировано не до конца.
 
Посмотрел твой вариант, кажись все должно работать.
Занят был сильно не проверил на боевой базе.
Обязательно проверю и еще раз поблагодарю :ay:
 
я вполне мог забыть , что то учесть, так что обязательно хорошо потестируй.удачи;)
 
Да все тут правильно. Заливай и работай!
 
mixamixa
Спасиб еще раз!
Проверил на боевой базе, немного подправил под себя - пашет скриптик.
Единственное, пока отлаживался через дебаггер так ни разу и не попал внутрь этого блока

Код:
else 
	{
		$stack[$idstack]=array();
		$currentidfindword=0;
		$currentfindword=$massivwords[0];	
##########################################
		if ($mas[$i]['content']==$currentfindword)
		{
	        	$stack[$idstack][]=$i;
        		if ($currentidfindword+1<count($massivwords))$currentidfindword++;
				   else $idstack++;
				$currentfindword=$massivwords[$currentidfindword];							
		}								
##########################################
		}

Странно, но факт.
 
Странно, даже в моем примере он туда попадает!!
скрипт туда попадает
1)если находимся в одном потоке
2)текущее слово не равно следующему слову поиска,а равно 1 слову поиска
 
Да это понятно, но странно, или я чего не доглядел.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху