Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2014, 17:36   #1
Andrej_K
Форумчанин
 
Регистрация: 27.07.2013
Сообщений: 256
По умолчанию Помогите с SQL запросом по выборке.

Мы задаём, например, три ключевых слова для поиска.
Бд ищет все файлы, к которым привязаны сразу все три наши заданные слова.
Бд проверяет у всех найденных файлов связи с другими словами и выдаёт все связанные слова.

Имеются три таблицы:

tablizca_izobrazhenij (id, izobrazheniya) — айди и имя файла;
tablizca_slov (id, slova) — айди и слово;
tablizca_svyazej (id_izobrazheniya, id_slova).

Помогите, пожалуйста, составить SQL запрос.

Вот что получилось у меня (связка с PHP), но он ищет все файлы, к которым привязано хоть одно заданное слово, а нужно, чтоб искал только те файлы, к которым привязаны сразу все слова:
PHP код:
//#### ФОРМИРУЕМ ЗАПРОС ################
    
$osnova_stroki_zaprosa implode("', '"$oporn_slova_bez_probelov);//делаем из массива опорных слов основу строки для sql запроса
    
$stroka_zaprosa "'" $osnova_stroki_zaprosa "'";//окончательно формируем строку для sql запроса
    
    
$rezultat_podbora mysql_query//подставляем строку для sql запроса в полный запрос
    
("
     SELECT `slova` FROM `tablizca_slov` WHERE `id` in
    (SELECT `id_slova` FROM `tablizca_svyazej` WHERE `id_izobrazheniya` in 
    (SELECT `id_izobrazheniya` FROM `tablizca_svyazej` WHERE `id_slova` in 
    (SELECT `id` FROM `tablizca_slov` WHERE `slova` IN (" 
$stroka_zaprosa "))))
    "
);
    
//############################################ 
Пожалуйста, прокомментируйте свой запрос, чтоб я мог его логику проследить, т. к. у меня только зачаточные знания синтаксиса.

Последний раз редактировалось Stilet; 18.07.2014 в 18:24.
Andrej_K вне форума Ответить с цитированием
Старый 21.07.2014, 17:52   #2
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

Код:
//#### ФОРМИРУЕМ ЗАПРОС ################
	$osnova_stroki_zaprosa = implode("' AND slova='", $oporn_slova_bez_probelov);//делаем из массива опорных слов основу строки для sql запроса
	$stroka_zaprosa = "'" . $osnova_stroki_zaprosa . "'";//окончательно формируем строку для sql запроса
	$stroka_zaprosa=" and slova='".$stroka_zaprosa."'"; //добавляем по бокам and  и кавычки
	$rezultat_podbora = mysql_query//подставляем строку для sql запроса в полный запрос
	("
	 SELECT `slova` FROM `tablizca_slov` WHERE `id` in
	(SELECT `id_slova` FROM `tablizca_svyazej` WHERE `id_izobrazheniya` in 
	(SELECT `id_izobrazheniya` FROM `tablizca_svyazej` WHERE `id_slova` in 
	(SELECT `id` FROM `tablizca_slov` WHERE  (" . $stroka_zaprosa . "))))
	");
	//############################################

Последний раз редактировалось Pamparam; 21.07.2014 в 18:00.
Pamparam вне форума Ответить с цитированием
Старый 22.07.2014, 21:59   #3
Andrej_K
Форумчанин
 
Регистрация: 27.07.2013
Сообщений: 256
По умолчанию

Спасибо, но сам алгоритм себя крайне не оправдал, очень долго ищет. От восьми минут и более… До сорока бывало)))
Andrej_K вне форума Ответить с цитированием
Старый 22.07.2014, 22:41   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от Andrej_K Посмотреть сообщение
очень долго ищет. От восьми минут и более… До сорока бывало)))
Сколько записей в БД?
Streletz вне форума Ответить с цитированием
Старый 23.07.2014, 09:34   #5
Andrej_K
Форумчанин
 
Регистрация: 27.07.2013
Сообщений: 256
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Сколько записей в БД?
Названия таблиц изменил, чтобы проще запрос был.
Вложения
Тип файла: rar webart_servis_kluchevyx_slov.rar (5.6 Кб, 5 просмотров)

Последний раз редактировалось Andrej_K; 23.07.2014 в 09:47.
Andrej_K вне форума Ответить с цитированием
Старый 24.07.2014, 10:56   #6
Andrej_K
Форумчанин
 
Регистрация: 27.07.2013
Сообщений: 256
По умолчанию

Тему можно закрывать.
На другом форуме подсказали решение, (Как организовать бд для вот такой задачи?) я переделал под свои названия:

Код:
$SQL_zapros = "select ts.s, count(*)
from (
  select t_s.id_n
  from  ts
  join t_s on t_s.id_s = ts.ids
  where ts.s in ('" . $oporn_slova . "')
  group by t_s.id_n having count(/*distinct*/ t_s.id_s) = " . $kolichestvo_opornyx_slov . "
  ) g
join t_s on t_s.id_n = g.id_n
join ts on ts.ids = t_s.id_s
group by t_s.id_s
order by count(*) desc, ts.s
;
";
tn (idn, n) — таблица наборов слов.
ts (ids, s) — таблица слов.
t_s (id_n, id_s) — таблица связей между наборами и словами.

Последний раз редактировалось Andrej_K; 24.07.2014 в 11:02.
Andrej_K вне форума Ответить с цитированием
Старый 24.07.2014, 11:02   #7
Andrej_K
Форумчанин
 
Регистрация: 27.07.2013
Сообщений: 256
По умолчанию

tn (idn, n) — таблица наборов слов.
ts (ids, s) — таблица слов.
t_s (id_n, id_s) — таблица связей между наборами и словами.
Andrej_K вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема в выборке из двух таблиц запросом SQL Server 2012 qpash SQL, базы данных 2 19.03.2014 10:04
Помогите с SQL-запросом FleshDro SQL, базы данных 15 28.07.2009 13:32
Помогите с SQL запросом DDmitriy Microsoft Office Access 4 07.05.2009 15:51
SQL. Помогите с запросом. fluxion БД в Delphi 2 27.12.2007 08:01
Помогите с SQL запросом. Monoflextor БД в Delphi 12 29.04.2007 16:53