Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
Таблица вида: 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)
Неактивен
Честно говоря, не понял, чем плохо будет, если Вы будете просто искать
по всей таблице. Ну и имеет смысл использовать полнотекстовый поиск,
а не такой LIKE.
Неактивен
смысл был в том, чтобы получать результат вида:
дата 5 (главное сообщение+дочернее1+дочернее[N]) релевантность 18
дата 4 (главное сообщение+дочернее1+дочернее[N]) релевантность 9
дата 3 (главное сообщение+дочернее1+дочернее[N]) релевантность 9
дата 2 (главное сообщение+дочернее1+дочернее[N]) релевантность 9
Неактивен
Могу предложить такой вариант: отличать родителей не по msg_id = NULL, а
по msg_id = id. Тогда можно искать по всей таблице, а потом делать группи-
ровку по msg_id
Неактивен