Bonjour,
je suis en train de construire un moteur de recherche PHP/MySQL sur une base assez important de membre (entre 100000 et 500000). Cette base contient un identifiant autoincrémenté (primary) et des champs de toutes sortes (SET, booléens, int, varchar, ...). À côté, j'ai d'autres tables qui permettent d'associer un rôle à chaque utilisateur (clé étrangère sur l'ID de l'utilisateur, puis clé étrangère sur le nom du rôle qui se situe dans une autre table).
Je souhaiterais faire un moteur de recherche sur cette base d'utilisateurs qui soit relativement simple à l'usage et qui permette de faire des recherches relativement complexes sur à peu près tous les champs + en rajoutant des contraintes sur lequel l'utilisateur ne peut pas avoir accès (limitation à une certaine ville par exemple).
J'ai donc imaginé un système de grille. On pourrait faire des "ET" en ajoutant une ligne et des "OU" en ajoutant une colonne. Sur chaque cellule de la grille, on peut définir le champ sur lequel on souhaite mettre la contrainte, un opérateur (field_in_set, NOT(field_in_set()), =, !=, >, >=, <, <=) et enfin l'argument de comparaison (Exemple : "Champ Nom", "=", "Dupont"). Ce système doit en théorie me permettre de couvrir la plupart des requêtes qui m'intéressent et être suffisamment intuitif pour l'utilisateur.
Problème : je sais très bien le faire sur la table la plus importante qui contient toutes les données, mais quand il s'agit de faire des requêtes un peu plus complexes qui font intervenir des jointures, c'est plus compliqué.
Par exemple sur les rôles. Si on souhaite mettre une contrainte juste comparer un seul rôle, je peux le faire avec un simple "=", ça ne pose pas de problèmes. Maintenant si je veux les utilisateurs qui sont à la fois "Modérateurs" et "Administrateurs" (exemple farfelu, au hasard), je ne peux plus le faire comme ça. En effet, dans ma liste, j'aurais quelque chose qui sera comme ça après jointure :
ID - nom - rôle
13 - Martin - Modérateur
13 - Martin - Administrateur
13 - Martin - Utilisateur
16 - Jean - Utilisateur
16 - Jean - Modérateur
Vous comprenez facilement qu'il faut que si je veux uniquement les utilisateurs à la fois "Modérateur" ET "Administrateur", je suis coincé avec mon bête "=". Il faudrait donc que je puisse faire une sorte d'intersection sur l'ID. Le problème est le même en "OU". Et pour compliquer encore, j'ai des jointures comme ça sur d'autres tables à faire.
Bref, pensez-vous qu'il est possible de faire un tel moteur de manière un peu plus simple, ou à défaut de m'aider un peu à solutionner mes soucis?
Merci d'avance !
nakwakwak
Partager