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