Page 1 sur 1

Requête complexe, qui semble impossible avec une seule table

Posté : 05 nov. 2008, 16:55
par bravegars
Bonjour,

J'ai un probleme et je ne trouve pas de solution.
J'ai plusieurs champs dans une table dont certains sont jumelés avec d'autres.
Ainsi les champs suivants

NOTE1 est jumelé avec CHIFFRE1
NOTE2 est jumelé avec CHIFFRE2 etc...

Chaque ligne de la table se décompose ainsi.
ID - PSEUDO - TITRE - ARTICLE - NOTE1 - NOTE2 - NOTE3 - CHIFFRE1 - CHIFFRE2 - CHIFFRE3

Il y a donc des centaines d'utilisateurs enregistrés.

les champs NOTE contiennent des mots, et les champs CHIFFRE des chiffres.
chaque mot correspond a un chiffre.

Je voudrais lorsque l'internaute tape un mot dans le moteur de recherche,
que SQL affiche les titres et articles des utilisateurs dont les champs NOTE
contiennent le mot recherché.

Jusque la ça va.

Le probleme est que je veux que les résultats s'affichent du plus grand
chiffre associé au plus petit. Comment faire pour que SQL reconnaisse automatiquement
le chiffre associé au mot dont il dépend ?

Un vrai casse tête chinois, je ne sais pas s'il existe une solution telle que j'ai construit
ma table.

La solution que je vois est la construction de plusieurs tables
avec les memes champs et une requete faites de jointures de tables entre elles.

Existe-t-il un type de champ dans SQL qui permet d'associer un champ avec un autre ?
Désolé je ne connais pas tous les types de champs je n'en utilise que 5 ou 6,
char varchar text int datime... en gros.

Posté : 05 nov. 2008, 18:34
par ouckileou
Effectivement si tu es prêt à le faire tu ferais mieux de remodéliser ça. Tu as des colonnes qui se répètent dans ta table (note1, note2, note3), c'est un signe flagrant de problème de modélisation.

Pour relier des enregistrements on utilise des clés, généralement numérique, donc entier (à voir le type suivant le nombre d'enregistrements possible (une centaine ou 10 millions ?)

Posté : 05 nov. 2008, 20:29
par bravegars
Oui en fait je n'avais pas du tout songé à la récupération des données
lorsque j'ai crée la table il y a plusieurs mois.

Je pense qu'il faut que je réorganise tout ça, tu as raison, ouckileou.

Je vais procéder ainsi :

garder la table actuelle qui contient les informations du titre et des articles
avec le nom de l'utilisateur.

Créer une vingtaine de tables PLUS supplémentaires contenant :

Le champ identique qui sera le nom de l'utilisateur, + Note, + Chiffre

et faire une requête du type :
$mot="essai";
$mql = "SELECT utilisateur, titre, article FROM maths A INNER JOIN plus1 B ON A.utilisateur=B.utilisateur INNER JOIN plus2 C ON A.utilisateur=C.utilisateur WHERE note='$mot' ORDER BY chiffre DESC";
Mais même ainsi, comment reconnaitre le champ chiffre correspondant au champ note
qui sera récupéré ? Merci encore :)

Posté : 05 nov. 2008, 20:58
par furiouslol
Salut

Je pense que ouckileou parle de refaire le modele de facon relationnelle, une table de users, une pour les note, et je sais pas a quoi correspond le chiffre mais on doit pouvoir le caser la dedans

Un user peut avoir écrit plusieurs notes, il te faut donc l'ID user dans ta table note etc ...

Explique la raison d'etre du chiffre et on t'aide sur le conceptuel

Posté : 05 nov. 2008, 21:14
par bravegars
Okay je vous explique le truc du machin du bidule...

utilisateur = le membre inscrit qui a laissé un article

note = un mot clé qui va permettre d'afficher les articles d'apres le nombre de point associés à ses mots clés.

chiffre = le nombre de points attribués à un mot clé

Lorsqu'un membre tape un mot clé,
le moteur doit retourner tous les articles correspondant (au mot clé) de celui qui a le plus
grand nombre de points à celui qui en a le moins.

Chaque article est associé à une vingtaine de mots clés qui sont eux meme associés
à leurs chiffre.

Cela ne doit pas etre si compliquer que ça a faire, mais j'ai pas encore trouvé la solution.

Je sais c'est un peu compliqué, mais bon je suis pas un pro.

Posté : 05 nov. 2008, 23:14
par furiouslol
ok donc le chiffre est en quelque sorte une pondération du mot clef pour un article donné, j'ai bon ? :lol:

Dans ce cas faut que tu ais une table user, une table article (qui contiendra une référence a id_user), et une table note, qui contiendra un champ id_article, un champ note et un champ chiffre

Avec ca tu pourras sortir tous les articles relatif a un mot clé et trié par chiffre de ce mot clef

Enfin si j'ai bien suivit :)

Apres je ne sais pas comment tu défini que tel article a quelle note et quel chiffre

Posté : 06 nov. 2008, 09:47
par bravegars
Merci à vous deux j'ai réussi.

J'ai créé une seconde table note avec un id article.
C'était assez simple en fait mais je m'étais compliquer la vie pour rien. :)