[Résolu] Simplification de requete SQL

Simplification de requete SQL [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 25-05-2012 à 11:50:21    

Bonjour,
J'ai réalisé une requête qui fonctionne bien, seulement elle est, à mon avis, hyper lourde. Je ne suis pas assez affuté pour réussir à simplifier mon code.
J'ai utilisé UNION pour assembler 3 requêtes semblables afin de faire "un tri" en plaçant "Zoom sur..." au début et "Revue de presse" à la fin.
 
SELECT DISTINCT  
  AGENT.ID_AGENT,
  (...)
  REFCENTREINTERET.LIBELLECENTREINTERET
FROM
  AGENT
  INNER(...)
WHERE
  REFCENTREINTERET.LIBELLECENTREINTERET LIKE 'Zoom sur...'
 
UNION
 
SELECT DISTINCT  
  AGENT.ID_AGENT,
  (...)
  REFCENTREINTERET.LIBELLECENTREINTERET
FROM
  AGENT
  INNER(...)
WHERE
  REFCENTREINTERET.LIBELLECENTREINTERET NOT LIKE 'Zoom sur...' AND
  REFCENTREINTERET.LIBELLECENTREINTERET NOT LIKE 'Revue de presse'
 
UNION
 
SELECT DISTINCT  
  AGENT.ID_AGENT,
  (...)
  REFCENTREINTERET.LIBELLECENTREINTERET
FROM
  AGENT
  INNER(...)
WHERE
  REFCENTREINTERET.LIBELLECENTREINTERET LIKE 'Revue de presse'
 
J'ai écourté avec (...)  
Y a-t-il moyen de simplifier ce code?
D'avance merci.


Message édité par mmanu le 25-05-2012 à 15:24:26
Reply

Marsh Posté le 25-05-2012 à 11:50:21   

Reply

Marsh Posté le 25-05-2012 à 11:56:55    

Bonjour,  
L'utilisation de like suppose un "%" dans la valeur et là je n'en vois pas.  
Soit tu cherche la valeur exacte et tu mets  = ou  !=
soit c'est une valeur qui contient la partie d'une chaine et là il faut utiliser le %


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

Marsh Posté le 25-05-2012 à 12:00:46    

tu peux faire une seule requete .
on va dire que c'est du mysql, un truc comme ça devrait  fonctionner  
 
ORDER BY  
case  
   when LIBELLECENTREINTERET= 'Zoom sur...' then 2  
    when LIBELLECENTREINTERET= 'Revue de presse' then 1  
    else 0
END  
DESC, ID_AGENT


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

Reply

Marsh Posté le 25-05-2012 à 13:29:34    

L'ensemble des conditions des 3 requêtes peuvent être mises dans le même WHERE en utilisant des OR entre les conditions mais je suis pas sûr que pour les perfs, ça soit une bonne idée.

Code :
  1. SELECT AGENT.ID_AGENT, REFCENTREINTERET.LIBELLECENTREINTERET
  2. FROM AGENT INNER(...)
  3. WHERE
  4.    (REFCENTREINTERET.LIBELLECENTREINTERET LIKE 'Zoom sur...' ) OR
  5.    (REFCENTREINTERET.LIBELLECENTREINTERET NOT LIKE 'Zoom sur...' AND REFCENTREINTERET.LIBELLECENTREINTERET NOT LIKE 'Revue de presse') OR
  6.    (REFCENTREINTERET.LIBELLECENTREINTERET LIKE 'Revue de presse' )
  7. GROUP BY ID_AGENT, LIBELLECENTREINTERET


 
Si tu veux que des ID_AGENT uniques au final, tu enlèves REFCENTREINTERET.LIBELLECENTREINTERET du select et du group by...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 25-05-2012 à 14:49:00    

rufo a écrit :

L'ensemble des conditions des 3 requêtes peuvent être mises dans le même WHERE en utilisant des OR entre les conditions mais je suis pas sûr que pour les perfs, ça soit une bonne idée.

Code :
  1. SELECT AGENT.ID_AGENT, REFCENTREINTERET.LIBELLECENTREINTERET
  2. FROM AGENT INNER(...)
  3. WHERE
  4.    (REFCENTREINTERET.LIBELLECENTREINTERET LIKE 'Zoom sur...' ) OR
  5.    (REFCENTREINTERET.LIBELLECENTREINTERET NOT LIKE 'Zoom sur...' AND REFCENTREINTERET.LIBELLECENTREINTERET NOT LIKE 'Revue de presse') OR
  6.    (REFCENTREINTERET.LIBELLECENTREINTERET LIKE 'Revue de presse' )
  7. GROUP BY ID_AGENT, LIBELLECENTREINTERET


 
Si tu veux que des ID_AGENT uniques au final, tu enlèves REFCENTREINTERET.LIBELLECENTREINTERET du select et du group by...


 
En fait, j’aimerais bien avoir au début de ma table tous les articles 'zoom sur' puis les autres et en dernier les 'revue de presse'.
 
Ta requête marche bien (sans le GROUP BY)  mais n'ordonne pas par centre d’intérêt comme je veux, et je voudrais aussi avoir tous les articles.


Message édité par mmanu le 25-05-2012 à 14:56:25
Reply

Marsh Posté le 25-05-2012 à 14:58:15    

Tu as essayé l'approche que je t'ai donnée ?

Message cité 1 fois
Message édité par flo850 le 25-05-2012 à 14:58:25

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

Reply

Marsh Posté le 25-05-2012 à 15:05:13    

flo850 a écrit :

Tu as essayé l'approche que je t'ai donnée ?


 
Et bien, j'ai regardé et n'avais pas tout compris.
La je regarde un peu plus et ca a l'air d'etre bon!
Oups
Je code et confirmerais.
 
Je confirme.  
Ca marche.
Merci


Message édité par mmanu le 25-05-2012 à 15:12:30
Reply

Marsh Posté le 25-05-2012 à 16:02:09    

Ma solution de fait pas de tri. Rien ne t'empêches d'ajouter la solution de flo850 à la mienne ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

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