JeuWeb - Crée ton jeu par navigateur
[Résolu]Relation m*n et tri - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu]Relation m*n et tri (/showthread.php?tid=2268)



[Résolu]Relation m*n et tri - uriak - 10-01-2008

Je suis en train de coder mon édtieur de lexique pour le jeu, et je me retrouve donc avec une jolie relation m*n : chaque terme utilisé est lié à n autres termes, et ce afin d'afficher un sympatique "voir aussi..."

Pour compliquer les choses, je vois la relation comme symétrique.
J'ai donc une table T avec id et name pour les champs(on se fiche du reste)
et une table L avec id_1 et id_2 qui vous le devinez jouent le rôle de clefs secondaires pour la table T et.. la table T

Faire une recherche des articles liés n'est pas dur.
Select * FROM T INNER JOIN L ON T.id=L.id_1 WHERE L.id_2 = "val"

Encore que ceci ne me donne que la moitié des liaisons, donc première question, comment je cumule les deux sur une même requête ? En gros je veux aboutir à la liste des T.id et T.name correspondant à toutes les occurences d'une valeur soit dans L.id_1, soit dans L.id_2

On suppose que les choses sont bien faites donc que id_1 est toujours différent de id_2 et que deux couples opposés n'existent pas.. ce qui nous amène à la seconde question

Dans mon éditeur je veux pour chaque article proposer la liste des articles auquel je pourrai le lier, c'est à dire tous les articles autres que lui-même, et pour lesquels il n'existe pas de couple L avec le premier article.

en Php, il me faudrait retrouver la liste de tous les articles liés, et la retrancher à la liste des articles autres que celui en court. Est-ce que vous voyez moyen de faire cela dans une requête, pour l'élégance et la rapidité ? (je vais me pencher sur la question, mais je ne peux pas trop le faire en journée ^^)


RE: Relation m*n et tri - pascal - 10-01-2008

ma proposition pour la requête :
Code :
SELECT *
FROM T, L
WHERE (T.id=L.id_1 AND L.id_2 = "val" )
OR  (T.id=L.id_2 AND L.id_1 = "val" )

on fait le lien sur une table et la recherche sur l'autre, et l'inverse.

A+

Pascal


RE: Relation m*n et tri - uriak - 10-01-2008

Oui, en fait je crois que j'étais passé à côté de l'évidence..

et je suppose que pour le tri exclusif,

Code :
SELECT T.*
FROM T,L
WHERE (T.id !="val' AND L.id_2!="val" AND L.id_2!="val")

La seule chose qui m'ennuie c'est le fait de générer une liste intermédiaire de taille m*n... peut être que de toute façon toute autre manière de procéder serait plus lente...

Est-ce que l'utilisation des fonctions UNION and MINUS/INTERSECT pourrait apporter quelque chose ? Wink


RE: Relation m*n et tri - uriak - 10-01-2008

Pas d'autres remarques ? ^^ Dans l'absolu la solution m'a été donné, je mets donc le tag résolu


RE: [Résolu]Relation m*n et tri - uriak - 10-01-2008

Bon en fait c'est pas résolu, du tout, c'est bon pour trouver toutes les tables liées, mais pas du tout pour trouver le complémentaire de cet ensemble, et là c'est le drame car je viens de lire que la commande SQL "MINUS" n'est pas encore implémentée en mySQL :'(

EDIT : c'est résolu, voilà la syntaxe complète pour trouver tous les articles différents de $ID et non liés à lui : j'utilise des requêtes internes mais je pense quand même que récupérer la liste des champs liés et la soustraire à celle de tous les champs est plus rapide, à faire en php ?

Code :
SELECT id, name
FROM T
WHERE id != "$ID"
AND NOT
EXISTS (

SELECT *
FROM L
WHERE (
(
id_1 = id
AND id_2 = "$ID"
)
OR (
id_2 = id
AND id_1 = "$ID"
)
)
)