Создание связанных или похожих сообщений с использованием PHP и MySQL

Я смотрел вокруг SO и задавался вопросом, как я буду заниматься созданием связанных или похожих сообщений для отображения на моем веб-сайте с использованием PHP и MySQL? Что является основным примером того, как это сделать?

Ответы

Ответ 1

Использование полнотекстового поиска MySQL MATCH (col1,col2,...) AGAINST (expr [search_modifier]).

Скажем, ваша таблица articles, и вам нужно найти соответствующие сообщения о заголовке текущего сообщения. Сделайте это так:

SELECT *, MATCH(title, body) AGAINST('$CurrentPostTitle') AS score
FROM articles 
WHERE MATCH(title, body) AGAINST('$CurrentPostTitle') 
ORDER BY score DESC LIMIT 5

Это даст вам 5 главных сообщений.

Но сначала запомните, чтобы включить полнотекстовый поиск для этих столбцов таблицы, выполнив этот запрос:

ALTER TABLE articles ADD FULLTEXT (title, body);

[EDIT]: Почему бы не использовать LIKE: Разъяснение для OP:

Потому что он не даст правильных результатов. Позвольте сказать, что ваше текущее название - "Музыка 1980 года", и вы хотите, чтобы на нем были ссылки. Теперь, если вы используете LIKE, тогда появятся только сообщения, содержащие ТОЧНО последовательность слов "Музыка 1980 года". Однако, если вы используете MATCH ... AGAINST, появятся сообщения, содержащие Music OR 1980. Кроме того, сообщения, содержащие как музыку, так и 1980, будут отображаться сверху, потому что они дают SCORE для каждого результата, и мы сортируем по этой оценке. Я надеюсь, что это ясно.

[EDIT]: 2:

Если у вас есть категории, вы можете добавить AND Category = '$CurrentCategory' в SQL-запрос where clause, чтобы получить более конкретные результаты.

[EDIT]: 3: OP не может использовать полный текст:

Если вы не можете использовать полный текст (по какой-то причине), вы можете просто показать 5 случайных записей из той же категории. Поскольку они относятся к одной категории, они как-то связаны по крайней мере:

SELECT *
FROM articles 
WHERE Category = '$CurrentCategory'
LIMIT 5

Отредактированный синтаксис: изменен LIMTI на LIMIT в коде MySQL

Ответ 2

В большинстве случаев вы захотите дать разные веса для соответствующих столбцов. Вы можете сделать это следующим образом:

SELECT 
    *, 
    ROUND(0 + 
               (MATCH(title) AGAINST('$CurrentPostTitle') * TITLE_WEIGHT) +
               (MATCH(body) AGAINST('$CurrentPostTitle') * BODY_WEIGHT)) AS score
FROM 
    articles 
HAVING 
    score > 0 
ORDER BY 
    score DESC 
LIMIT 5

Просто замените TITLE_WEIGHT и BODY_WEIGHT на вес в виде целого числа.

Работая таким образом, вам нужно будет добавить FULLTEXT в каждый столбец:

ALTER TABLE articles ADD FULLTEXT (title);
ALTER TABLE articles ADD FULLTEXT (body);

Если это так, не забудьте исключить текущее сообщение из результатов. Вы можете сделать это с условием WHERE до того, как это будет:

WHERE id <> $CurrentPostId