IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Possible d'optimiser (Plusieurs querys en 1 seule)??


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut Possible d'optimiser (Plusieurs querys en 1 seule)??
    Bonjour!

    Je dois executer plusieurs requetes de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Type 1:
    SELECT count(*) FROM Table1 WHERE Ville='Paris' AND CodeMachine='bloblo' AND Processus='blabla' AND DateDebut BETWEEN dateDebut AND 'dateFin'
    OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Type 2:
    SELECT count(*) FROM Table1 AS t1
    WHERE Ville='Paris'
    AND CodeMachine='bloblo'
    AND Processus='blabla'
    AND DateDebut BETWEEN '$dateDebut' AND 'DateFin'
    AND t1.id IN ( SELECT id FROM Operation WHERE numOperation='blublu')
    Je dois afficher le resultat de ces requetes pour plusieurs semaines.
    Donc j'ai plusieurs requete de type1 et de type2 avec pour unique changement les dates.
    Exemple pour 3 semaines (avec une requete type1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT count(*) FROM Table1 WHERE Ville='Paris' AND CodeMachine='bloblo' AND Processus='blabla' AND DateDebut BETWEEN '2005-11-07 00:00:00.000000' AND '2005-11-13 23:59:59.000000'
     
    SELECT count(*) FROM Table1 WHERE Ville='Paris' AND CodeMachine='bloblo' AND Processus='blabla' AND DateDebut BETWEEN '2005-11-14 00:00:00.000000' AND '2005-11-20 23:59:59.000000'
     
    SELECT count(*) FROM Table1 WHERE Ville='Paris' AND CodeMachine='bloblo' AND Processus='blabla' AND DateDebut BETWEEN '2005-11-21 00:00:00.000000' AND '2005-11-27 23:59:59.000000'
    Est-il possible de regrouper ces requetes en 1 seule (en gardant le regroupement par dates) et donc qui me retournerait 3 resultats?
    Si une telle requete existe, est-elle plus rapide à exécuter que les 3 requetes séparements ? --> Je pose cette derniere question, car je programme en PHP pour utiliser ces requete sur une base IBM DB2...

    Merci d'avance pour vos reponses

  2. #2
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(*) FROM Table1 WHERE Ville='Paris' AND CodeMachine='bloblo' AND Processus='blabla' AND 
     (DateDebut BETWEEN '2005-11-07 00:00:00.000000' AND '2005-11-13 23:59:59.000000' or 
     DateDebut BETWEEN '2005-11-14 00:00:00.000000' AND '2005-11-20 23:59:59.000000' or
     DateDebut BETWEEN '2005-11-21 00:00:00.000000' AND '2005-11-27 23:59:59.000000')

  3. #3
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Sous IBM DB2 tu pourrais faire aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT count(*) FROM Table1 WHERE Ville='Paris' AND CodeMachine='bloblo' AND Processus='blabla' AND 
    WEEK(DateDebut) BETWEEN (50 and 51)
    La function WEEK(Date) retourne le numéro de semaine qui est entre 1 et 54.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par souellet
    Sous IBM DB2 tu pourrais faire aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT count(*) FROM Table1 WHERE Ville='Paris' AND CodeMachine='bloblo' AND Processus='blabla' AND 
    WEEK(DateDebut) BETWEEN (50 and 51)
    La function WEEK(Date) retourne le numéro de semaine qui est entre 1 et 54.
    Je connaissais pas, merci .
    Mais dans mon cas, ca ne fonctionnera pas bien...
    La boite où je suis en stage considere que la semaine commence le samedi et fini le vendredi...Donc a moins ke l'on puisse indiquer cette subtilité, ca ne sera pas tout a fait ok.

    souellet: J'ai essayé ta solution juste avant de partir. Elle fait un unique count pour toutes les dates dont on a donné les bornes

    En fait, j'aimerais avoir le count(*) decomposé par semaine...

  5. #5
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    1) quel est votre SGBDR ? La disponibilité des fonctions temporelles est assez dépendante de l'éditeur (cf les fonctions)
    2) Selon le SGBDR, il est possible de configurer le 1er jour de la semaine
    3) pour le regroupement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT WEEK(DateDebut) , count(*) FROM Table1 
    WHERE Ville='Paris' 
    AND CodeMachine='bloblo' 
    AND Processus='blabla' 
    AND WEEK(DateDebut) BETWEEN (50 and 51)
    group by WEEK(DateDebut)
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par fadace
    1) quel est votre SGBDR ? La disponibilité des fonctions temporelles est assez dépendante de l'éditeur (cf les fonctions)
    Alors le SGBDR que j'utilise est IBM DB2 v7.
    Et j'y accède dans une application PHP que je developpe avec ODBC.
    (Je sais qu'il existe une extension ibm_db2 qui une extension PECL, mais etant en stage, je ne sais pas où va etre installé l'appli, ni si PHP est installé avec les extensions nécessaires...ODBC ma paru plus simple)

    Citation Envoyé par fadace
    2) Selon le SGBDR, il est possible de configurer le 1er jour de la semaine
    J'ai cherché un peu dans l'aide d'IBM DB2, mais je n'ai pas trouvé mon bonheur .
    Si tu as plus d'infos sur ce point, je suis preneur

    Citation Envoyé par fadace
    3) pour le regroupement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT WEEK(DateDebut) , count(*) FROM Table1 
    WHERE Ville='Paris' 
    AND CodeMachine='bloblo' 
    AND Processus='blabla' 
    AND WEEK(DateDebut) BETWEEN (50 and 51)
    group by WEEK(DateDebut)
    Merci Fadace (ainsi que toutes les autres personnes qui m'ont repondu).
    Ta requete fonctionne à merveille et donne les resultats rapidement.
    J'ai testé dans le Command Center. Je vais pouvoir integrer la requete dans PHP, en esperant que la rapidité soit identique

    Bon, a pars le pb du 1er jour de la semaine que je souhaite fixer au samedi, je considere que mon probleme est résolu.

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Pour résoudre ton dernier problème, il doit suffire de mettre (par exemple)
    WEEK(DateDebut + 2), ce qui décale toutes les dates de 2 jours.
    Peut-être qu'avec ton SGBD ajouter 2 sur une date est un peu plus compliqué...

    Je voudrais aussi attirer ton attention sur le fait que la requête ne peut fonctionner que sur une année, si tu cherches les informations de la 52 ième semaine de 2005 à la 2ième de 2006, BETWEEN 52 AND 2 va te générer une erreur. Il te faut intégrer l'année pour avoir un BETWEEN 200552 AND 200602
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par Médiat
    Je voudrais aussi attirer ton attention sur le fait que la requête ne peut fonctionner que sur une année, si tu cherches les informations de la 52 ième semaine de 2005 à la 2ième de 2006, BETWEEN 52 AND 2 va te générer une erreur. Il te faut intégrer l'année pour avoir un BETWEEN 200552 AND 200602
    J'ai pensé a ce probleme, et je m'arrange dans mon code PHP pour que ce cas ne soit pas pris en compte
    je fais un controle sur la borneMin et Max du between...
    BorneMin > BorneMax --> erreur gere par mon code ^^

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Pour résoudre ton dernier problème, il doit suffire de mettre (par exemple)
    WEEK(DateDebut + 2), ce qui décale toutes les dates de 2 jours.
    Peut-être qu'avec ton SGBD ajouter 2 sur une date est un peu plus compliqué...
    Pas mal l'idée
    Ca serait pas WEEK(DateDebut + 1) plutot ?
    WEEK considere que la semaine commence le dimanche (donc le samedi juste avant appartient a la semaine precedente)
    Donc Semaine = Dimanche à Samedi

    Si j'ai bien compris, Si DateDebut est un samedi, WEEK(DateDebut + 1) retournera le numero de semaine du dimanche suivant. Pour le vendredi, pas de probleme. +1 le considerera dans la bonne semaine (Consideré comme un samedi, mais avec la norme de WEEK(), c bon)

    J'ai bien compris ?

  10. #10
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par MadCat34
    J'ai bien compris ?
    Ca m'en a tout l'air
    J'avais mis + 2 car pour moi (et la norme ISO) les semaines commencent le lundi.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Alors, la solution pour ajouter n jours (pour IBM DB2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT ... FROM ... WHERE WEEK(DateDebut + 1 day) BETWEEN 50 AND 51
    En fait, c'etait tout bete. Pas besoin de fonction comme dans MS SQL Server

  12. #12
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Oubli pas de mettre le tag résolu!

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par souellet
    Oubli pas de mettre le tag résolu!
    C'est fait depuis un moment

  14. #14
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Probablement le décalage!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2014, 17h50
  2. Optimisation de plusieurs requêtes en une seule ?
    Par Christophe Charron dans le forum Requêtes
    Réponses: 0
    Dernier message: 24/10/2009, 12h42
  3. Executer plusieurs requêtes par un seul composant query
    Par magicstar dans le forum Débuter
    Réponses: 18
    Dernier message: 24/10/2009, 11h56
  4. Réponses: 3
    Dernier message: 06/04/2007, 10h09
  5. [optimisation] Plusieurs formulaires vs 1 seul ?
    Par Mos dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 02/11/2004, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo