Remplacer OR par JOIN

Remplacer OR par JOIN - SQL/NoSQL - Programmation

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

Reply

Marsh Posté le 19-02-2009 à 10:05:03   

Reply

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


---------------

Reply

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 ?  
 
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


 
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 ?

Reply

Marsh Posté le 19-02-2009 à 12:39:40    

Actuellement j'ai:

 


Code :
  1. SELECT *
  2. FROM t1
  3. WHERE ((id_el1=1 AND id_el2=2) OR (id_el1=2 AND id_el2=1))
  4. AND type = 1


mais je veux pas de OR :(

 

Merci


Message édité par xtof_83 le 19-02-2009 à 14:38:36
Reply

Marsh Posté le 19-02-2009 à 13:34:48    

Déjà, ta requête est fausse :
 

Code :
  1. SELECT *
  2. FROM t1
  3. WHERE ((id_el1=1 AND id_el2=2) OR (id_el1=2 AND id_el2=1))
  4. AND type = 1


 
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 :
  1. SELECT *
  2. FROM (
  3.   SELECT id_el1 el1, id_el2 el2, type
  4.   FROM t1
  5.   union ALL
  6.   SELECT id_el2 el1, id_el1 el2, type
  7.   FROM t1
  8. ) t1
  9. WHERE el1 = 1 AND el2 = 2 AND type = 1


 
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.

Reply

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 :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 19-02-2009 à 14:45:33    

tu lui fais peur :o


---------------

Reply

Marsh Posté le 19-02-2009 à 14:48:15    

flo850 a écrit :

tu lui fais peur :o


Probablement :o
 
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)


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 19-02-2009 à 14:53:23    

joce a écrit :


Probablement :o
 
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)


 
thx boss,  [:mc ewans]

Reply

Marsh Posté le 19-02-2009 à 15:00:01    

c'est bien la peine de se faire chier à répondre tiens :o
 
et le ALL au UNION bordel :o

Reply

Marsh Posté le 19-02-2009 à 15:00:01   

Reply

Marsh Posté le 19-02-2009 à 15:40:40    

MagicBuzz a écrit :

c'est bien la peine de se faire chier à répondre tiens :o
 
et le ALL au UNION bordel :o


 

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 ;)

Reply

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 ;)

Reply

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


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 19-02-2009 à 17:18:46    

ah oui, si y'a tout le temps que deux ligne... :D

Reply

Marsh Posté le 19-02-2009 à 18:04:28    

MagicBuzz a écrit :

ah oui, si y'a tout le temps que deux ligne... :D


une seule en fait :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed