SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.05.2010 15:10:08

Kew
Участник
Зарегистрирован: 25.05.2010
Сообщений: 2

Поиск по одной, но двойственной таблице

Здравствуйте!
Таблица вида: id, header, message, posted, msg_id
есть главные строки(сообщения) msg_id = NULL
и дочерние msg_id = "Ид главной строки"

Стоит вот такая задача поиска:
искать все слова (и/или) в Главных строках и относящихся к ним дочерних.
Реализовал следующую конструкцию:
$good_words = "слово1 слово2 слово3"

$query = "SELECT id, header, message, date_format(posted,'%e.%c.%y') AS date1,
IF(message like '%". $good_words. "%', ". (substr_count($good_words, " ") + 1). "*10, 0) +
IF(message LIKE '%". str_replace(" ", "%', 9, 0) + IF(message LIKE '%", $good_words). "%', 9, 0)
AS relevance FROM ".TBL."bank_book WHERE
(message LIKE '%". str_replace(" ", "%' $logic message LIKE '%", $good_words). "%')
AND msg_id='' ORDER BY relevance DESC, posted DESC";

вобщем впроцессе выходит следующий запрос:
SELECT id, header, message, date_format(posted,'%e.%c.%y') AS date1,
IF(message like '%слово1 слово2 слово3%', 3*10, 0) + IF(message LIKE '%слово1%', 9, 0) +
IF(message LIKE '%слово2%', 9, 0) +
IF(message LIKE '%слово3%', 9, 0) AS relevance
FROM bank_bank_book
WHERE (message LIKE '%слово1%' OR message LIKE '%слово2%' OR message LIKE '%слово3%')
AND msg_id=''
ORDER BY relevance DESC, posted DESC

Итак, я получаю на выходе последние запросы сортированные по релевантности и по дате.
Но это всего лишь главные строки ( msg_id = NULL )

Вот никак не могу сообразить как мне прикрутить в поиск запроса дочерних?
думал вот так хоть, собрать и выдавать попутно с главной строкой:
(SELECT Group_Concat(message ORDER BY posted) FROM bank_bank_book WHERE msg_id=t1.id GROUP BY msg_id) as comments
но в Group_Concat существует ограничение на максимальное количество символов на выходе.

Подскажите как в моём случае выбирать при поиске текст главного сообщения и все тексты дочерних этого сообщения. И собвственно искать так...
Идеи были вот:
1. собрать виртуальную таблицу, в которой поместить все тексты дочерних к главному сообщению.( как это сделать?) Затем уже в этой таблице искать по представленному способу.
2. при запросе объединять дочерние с главным текстами.

Отредактированно Kew (25.05.2010 15:11:02)

Неактивен

 

#2 25.05.2010 20:51:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Поиск по одной, но двойственной таблице

Честно говоря, не понял, чем плохо будет, если Вы будете просто искать
по всей таблице. Ну и имеет смысл использовать полнотекстовый поиск,
а не такой LIKE.

Неактивен

 

#3 26.05.2010 07:18:50

Kew
Участник
Зарегистрирован: 25.05.2010
Сообщений: 2

Re: Поиск по одной, но двойственной таблице

смысл был в том, чтобы получать результат вида:

дата 5 (главное сообщение+дочернее1+дочернее[N]) релевантность 18
дата 4 (главное сообщение+дочернее1+дочернее[N]) релевантность 9
дата 3 (главное сообщение+дочернее1+дочернее[N]) релевантность 9
дата 2 (главное сообщение+дочернее1+дочернее[N]) релевантность 9

Неактивен

 

#4 27.05.2010 01:15:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Поиск по одной, но двойственной таблице

Могу предложить такой вариант: отличать родителей не по msg_id = NULL, а
по msg_id = id. Тогда можно искать по всей таблице, а потом делать группи-
ровку по msg_id wink

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson