Structure de requete compliquée HELP PLEASE

Structure de requete compliquée HELP PLEASE - SQL/NoSQL - Programmation

Marsh Posté le 22-05-2006 à 19:59:01    

je recherche deux items
item1
item2...
dans 3 champs
champ1
champ2
champ3...
 
je veux sortir les résultats qui contiennent les 2 items :
-- dans le champ1 obligatoirement
ET
-- dans le champ2 OU dans le champ 3
 
je suis pas sur de mon coup sur la structure de la requete
donc si j'ai :  
champ1 ET aucun champ
OU
champ1 ET champ2
OU
champ1 ET champ3
OU
champ1 ET champ2 et champ3...
 
... qui contiennent ma recherche, je l'affiche
 
un bout de code suivra tout de suite après
 
Merci de votre aide


Message édité par erwan83 le 22-05-2006 à 20:16:21

---------------
http://www.ypikay.com
Reply

Marsh Posté le 22-05-2006 à 19:59:01   

Reply

Marsh Posté le 22-05-2006 à 20:05:32    

SELECT *  FROM TABLE WHERE  
champ1 LIKE %$item1% AND champ1 LIKE %$item2% AND
champ2 LIKE %$item1% AND champ2 LIKE %$item2% OR
champ3 LIKE %$item1% AND champ3 LIKE %$item2%
 
...
 
ou puis-je ecrire...
 
SELECT *  FROM TABLE WHERE  
(champ1 LIKE %$item1% AND champ1 LIKE %$item2% AND champ2 LIKE %$item1% AND champ2 LIKE %$item2%)
 OR
(champ1 LIKE %$item1% AND champ1 LIKE %$item2% AND champ3 LIKE %$item1% AND champ3 LIKE %$item2%)
 
...
???
 


---------------
http://www.ypikay.com
Reply

Marsh Posté le 23-05-2006 à 10:26:52    

Si j'ai bien compris ton besoin, ca devrait ressembler à quelque chose comme ça :
 

Code :
  1. select *
  2. from table
  3. where
  4. exists (select 1
  5.  from table
  6.  where champ1 like '%$item1%')
  7. and exists (select 1
  8.  from table
  9.  where champ1 like '%$item2%')
  10. and exists (select 1
  11.  from table
  12.  where champ2 like '%$item1%'
  13.  or    champ3 like '%$item1%')
  14. and exists (select 1
  15.  from table
  16.  where champ2 like '%$item2%'
  17.  or    champ3 like '%$item2%')

 
 
par contre autant de like c'est pas terrible pour les perfs, tu ne peux pas faire une équi-jointure ?

Reply

Marsh Posté le 23-05-2006 à 13:08:05    

je vais y reflechir
effectivement ca ralentit
mais je code en PHP sur MySQL et tous les resultats sont issus de la même table...  
Aurais tu un exemple d'equi jointure ?


---------------
http://www.ypikay.com
Reply

Marsh Posté le 23-05-2006 à 13:58:24    

a mon avis tu dois pouvoir t'en sortir sans jointure en rusant via des concats, un truc dans le genre:

Code :
  1. select
  2. *
  3. from
  4. tatable
  5. where
  6. ';'||champs1||';'||champs2||';'||champs3||';' like '%;item1;%'
  7. AND
  8. ';'||champs1||';'||champs2||';'||champs3||';' like '%;item2;%'


gaffe à la façon d'écrire les concats selon ton sgbd

Reply

Marsh Posté le 23-05-2006 à 14:21:20    

équi-jointure c'est du type champ1 = '$item1' mais si c'est pour faire de la recherche sur un libellé tu seras obligé d'utiliser des like.
 
le problème avec les like c'est que le sgbd déroule toute ta table en entier alors quand tu les enchaînes comme ça selon le nombre d'enregistrements que tu as sur ta table, ca peut vite devenir horrible au niveau des perfs.

Reply

Marsh Posté le 23-05-2006 à 17:59:50    

oui oui voila effectivement le probleme que je me pose


---------------
http://www.ypikay.com
Reply

Marsh Posté le 23-05-2006 à 23:13:51    

dans ce cas là (si tu as des problèmes de perf), il faut revoir ta modélisation je pense.

Reply

Sujets relatifs:

Leave a Replay

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