Remplacer OR par JOIN - SQL/NoSQL - Programmation
Marsh Posté le 19-02-2009 à 10:13:49
tu es sur que tu n'as pas un soucis de structure de table ?
est ce que tu ne devria pas ajouter une table intermediaire pour faire le lien
au lieu d'avoir
table1:
idT1
donneest1
table2:
idT1
idT1bis
idT1ter
donnees
passer a une structure:
table1
idT1
donneest1
tableLien
idT1
idT2
donnes spécifique a la jointure
table2:
idT2
donnees
Marsh Posté le 19-02-2009 à 10:26:27
flo850 a écrit : tu es sur que tu n'as pas un soucis de structure de table ? |
Non je pense pas...
Dans mon unique table id_el1 et id_el2 sont au sens sémantique pareil.
du style:
Jean (1) est le cousin de Paul (2)
Donc dans la base on a bien:
id_el1 = 1
id_el2 = 2
Je pourrais dupliquer l'info, c'est certain... Mais là je veux la regrouper.
Donc avoir une requêtre qui me renvoie la ligne unique quelque soit le sens de id_el1 et id_el2:
id_el1 = 1
id_el2 = 2
ou
id_el1 = 2
id_el2 = 1
c'est mieux ?
Marsh Posté le 19-02-2009 à 12:39:40
Actuellement j'ai:
Code :
|
mais je veux pas de OR
Merci
Marsh Posté le 19-02-2009 à 13:34:48
Déjà, ta requête est fausse :
Code :
|
Ca marchera beaucoup mieux.
Pkoi tu veux pas de OR ? (à cause de ce bug que je viens de corriger ?)
Sinon, par jointure, faudrait déjà que tu ait quelquechose à joindre... Genre deux tables. Là t'en a qu'une (??)
Avec un UNION à la limite... Genre histoire de faire simple et bien mettre à genoux ton serveur :
Code :
|
Mais bon, là t'as vraiment envie de tout mettre par terre.
Par contre, un truc pas con, ce serait de mettre en place un trigger sur t1 qui crée instantanément la ligne inverse.
Marsh Posté le 19-02-2009 à 14:43:43
Je suis à 3m de toi et tu viens même pas me poser la question, shame on you xtof
Marsh Posté le 19-02-2009 à 14:48:15
flo850 a écrit : tu lui fais peur |
Probablement
Sinon moi j'utilise :
SELECT * FROM t1 WHERE id_el1=1 AND id_el2=2 AND type = 1
UNION
SELECT * FROM t1 WHERE id_el1=2 AND id_el2=1 AND type = 1
(on peut pas avoir les deux lignes présentes en même temps dans la db, et au pire limit 1 et rulez)
Marsh Posté le 19-02-2009 à 14:53:23
joce a écrit : |
thx boss,
Marsh Posté le 19-02-2009 à 15:00:01
c'est bien la peine de se faire chier à répondre tiens
et le ALL au UNION bordel
Marsh Posté le 19-02-2009 à 15:40:40
MagicBuzz a écrit : c'est bien la peine de se faire chier à répondre tiens |
Citation : The default behavior for UNION is that duplicate rows are removed from the result. The optional DISTINCT keyword has no effect other than the default because it also specifies duplicate-row removal. With the optional ALL keyword, duplicate-row removal does not occur and the result includes all matching rows from all the SELECT statements. |
1_ logiquement on a pas de duplicate
2_ s'il y en avait j'en voudrais pas
Merci pour tout
Marsh Posté le 19-02-2009 à 15:43:27
Le ALL n'est pas là pour rajouter des duplicates, mais pour optimiser la requête de façon drastique : sans ALL, le SGBD va se faire chier à vérifier que les lignes sont bien uniques. Vu que tu le sais déjà, ça sert à rien de lui faire faire le travail deux fois
Marsh Posté le 19-02-2009 à 16:49:05
MagicBuzz a écrit : Le ALL n'est pas là pour rajouter des duplicates, mais pour optimiser la requête de façon drastique : sans ALL, le SGBD va se faire chier à vérifier que les lignes sont bien uniques. Vu que tu le sais déjà, ça sert à rien de lui faire faire le travail deux fois |
Ouaip Enfin ceci dit, c'est de l'ultra micro optimisation vu que chaque SELECT ne peut renvoyer qu'une seule ligne dans notre cas, et que les deux SELECT ne renvoient jamais tous les deux des résultats en même temps
Marsh Posté le 19-02-2009 à 17:18:46
ReplyMarsh Posté le 19-02-2009 à 18:04:28
MagicBuzz a écrit : ah oui, si y'a tout le temps que deux ligne... |
une seule en fait
Marsh Posté le 19-02-2009 à 18:05:58
xtof_83 a écrit : |
http://forum.hardware.fr/hfr/Discu [...] 8680_1.htm
Marsh Posté le 19-02-2009 à 10:05:03
Bonjour
j'ai une table avec 3 champs:
id_el1 id_el2 id_type
avec comme contenu:
1 2 1
Mais c'est possible d'avoir:
2 1 1
C'est quoi la requête pour matcher cette ligne sachant que j'ai selon le contexte id_el1 = 1 et id_el2 = 2 ou id_el1 = 2 et id_el2 = 1
C'est possible avec un Left join, mais j'arrive pas...
ps: je veux pas utiliser OR
Merci