Mysql
 sql >> Base de données >  >> RDS >> Mysql

Création d'un article connexe ou similaire à l'aide de PHP et MySQL

Utilisation de la recherche en texte intégral MySQL MATCH (col1,col2,...) AGAINST (expr [search_modifier]) chose.

Disons que votre table est articles et vous devez trouver des publications connexes sur un titre de publication actuelle. Faites comme ceci :

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

Cela vous donnera les 5 meilleurs messages liés.

Mais n'oubliez pas d'activer la recherche en texte intégral pour les colonnes de cette table, en exécutant cette requête :

ALTER TABLE articles ADD FULLTEXT (title, body);

[EDIT] :pourquoi ne pas utiliser LIKE : Clarification à l'OP :

Parce que cela ne donnera pas de résultats corrects. Disons que votre titre actuel est "Musique de 1980" et que vous voulez des articles connexes à ce sujet. Maintenant, si vous utilisez LIKE alors seuls les messages contenant EXACTEMENT la séquence de mots "Musique de 1980" apparaîtront. Cependant, si vous utilisez MATCH ... AGAINST , les publications contenant Musique OU 1980 apparaîtront. De plus, les messages qui contiennent à la fois Musique et 1980 apparaîtront en haut car cela donne un SCORE à chaque résultat et nous trions selon ce score. J'espère que c'est clair.

[MODIFIER] :2 :

Si vous avez des catégories, vous pouvez ajouter AND Category = '$CurrentCategory' dans la requête SQL where clause pour obtenir des résultats plus spécifiques.

[EDIT] :3 :OP ne peut pas utiliser le texte intégral :

Si vous ne pouvez pas utiliser le texte intégral (pour une raison quelconque), vous pouvez simplement afficher 5 messages aléatoires de la même catégorie. Comme ils sont dans la même catégorie, ils sont en quelque sorte liés au moins :

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

Syntaxe modifiée :modification de LIMTI en LIMIT dans le code MySQL