Match, Against, Like, Regexp... je ne sais...

Eléphant du PHP | 85 Messages

24 août 2010, 15:09

Bonjour,

J'ai une requête un peu particulière à faire et je bloque.
Du moins j'ai réussi à la faire avec des UNION, mais la requête est énorme, aussi je cherche à faire plus simple.

J'ai donc une table News dans laquelle j'ai tout un tas de champs, dont : IdNews, KeyWord1, KeyWord2, KeyWord3 et KeyWord4

Lorsque j'affiche une news, je souhaites afficher les 5 articles les plus en relation via les keyword.
Et le tout sans faire de requête avant pour trouver les keywords.
Je doit tout faire en ayant à utiliser que l'id de la news appelé En gros faire du WHERE ... = (SELECT KeyWord1 FROM News WHERE IdNews = $id)

J'essaie de procéder ainsi :

Recherche des news dont les 4 keywords correspondent a ceux de la news appelé, puis de 3 keyword correspondant, puis de 2 keyword correspondant.
Je récupère les 5 premiers résultats
Les keywords ne sont pas forcément dans le même ordre (ex : news1 keywords = "Course, F1, BMW, Allemagne", news2 keywords = "Allemagne, F1, voiture, circuit")


J'essaie avec des Like, des Regexp et même des match against sans résultats.

Merci

Mammouth du PHP | 661 Messages

24 août 2010, 20:39

Du moins j'ai réussi à la faire avec des UNION, mais la requête est énorme, aussi je cherche à faire plus simple.
(...)
Et le tout sans faire de requête avant pour trouver les keywords.
Je doit tout faire en ayant à utiliser que l'id de la news appelé En gros faire du WHERE ... = (SELECT KeyWord1 FROM News WHERE IdNews = $id)
pourquoi ne pas faire une FUNCTION ... ? ainsi tu ne feras qu'un seul appel à ta BDD depuis ton script PHP, ce sera d'ailleurs, ultra simple à écrire, et Mysql pourra faire 2 ou 3 requetes pré-enregistrées pour te fournir les résultats que tu demandes ...
CREATE FUNCTION sur MySQL

@++

ViPHP
ViPHP | 5462 Messages

24 août 2010, 21:51

y'a un soucis dans ton truc, deja :
KeyWord1, KeyWord2, KeyWord3 et KeyWord4

c'est pas bien, pourqioi ne pas faire un table keyword ?
il suffirait de faire un SOME apres

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

25 août 2010, 08:50

Du moins j'ai réussi à la faire avec des UNION, mais la requête est énorme, aussi je cherche à faire plus simple.
(...)
Et le tout sans faire de requête avant pour trouver les keywords.
Je doit tout faire en ayant à utiliser que l'id de la news appelé En gros faire du WHERE ... = (SELECT KeyWord1 FROM News WHERE IdNews = $id)
pourquoi ne pas faire une FUNCTION ... ? ainsi tu ne feras qu'un seul appel à ta BDD depuis ton script PHP, ce sera d'ailleurs, ultra simple à écrire, et Mysql pourra faire 2 ou 3 requetes pré-enregistrées pour te fournir les résultats que tu demandes ...
CREATE FUNCTION sur MySQL

@++
Attention, les fonctions ne réduisent pas le nombres de requêtes !!!

Toute requête qui sera présente dans la fonction sera exécutée. La seule différence, c'est que la définition sera directement dans le SGBD et pas dans le code PHP.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 661 Messages

25 août 2010, 11:07

Attention, les fonctions ne réduisent pas le nombres de requêtes !!!
OUI, bien sur, je ne voulais pas dire que ça réduisais le nb de requêtes, mais il me semble que le souhait soit plus qu'il y ai moins d'appel depuis le php que de requêtes véritable !...
Si il souhaite réellement une seul requête, en faisant une vue cela sera tout de même plus digeste pour son code php...

Mais, même si je ne suis pas spécialiste MySQL, je ne penses pas qu'une requêtes tapant sur 36 sous requêtes blindées de jointure et de Match soit réellement plus rapide qu'une fonction contenant 3 requêtes simple ! cela dit, je peux me tromper, et si quelqu'un pouvait me corriger ou confirmer, je l'en remercierais ! :D

Eléphant du PHP | 85 Messages

27 août 2010, 13:30

y'a un soucis dans ton truc, deja :
KeyWord1, KeyWord2, KeyWord3 et KeyWord4

c'est pas bien, pourqioi ne pas faire un table keyword ?
Euhhh, pourquoi ?

J'ai une table news avec le titre, la dates, etc et 4 mots clés pour cibler la news.
Ca changerais quoi de créer un table uniquement pour les keyword ?
Et comment la créer ... Un liste de keyword avec tous les id qui sont ciblé par ceux-ci ? Ou une liste d'id avec les 4 keyword associé ?

il suffirait de faire un SOME apres
Bah désolé. Mais je ne vois pas du tout ou on va. :oops:


Pour info, j'y suis presque arrivé avec match/against, mais il est impossible de mettre une sous requête dans un against.

Eléphant du PHP | 314 Messages

27 août 2010, 13:57

Salut,

avec la proposition de stealth35 tu aurais...

Code : Tout sélectionner

news news_id - titre - contenu 1 - blabla - bloblo 2 - blabla - bloblo 3 - blabla - bloblo

Code : Tout sélectionner

keyword keyword_id - nom 1 - machin 1 - truc 1 - bidule

Code : Tout sélectionner

news_keyword news_keyword_id - news_id - keyword_id 1 - 1 - 1 2 - 1 - 3 3 - 2 - 3 4 - 3 - 1 5 - 3 - 2
Ainsi a la news 1 tu auras le keyword 1 et 3, a la news 2 le keyword 3, a la news 3 les keywords 1 et 2, ect ect
Cordialement,
Julien - http://laravel.fr/

Eléphant du PHP | 85 Messages

28 août 2010, 12:48

Ah, ok, donc une table de transition entre les deux autres.

Ca marche. Merci.