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 :

Optimisation requête pour cause de Maximum execution time


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Optimisation requête pour cause de Maximum execution time
    Bonjour,
    Je viens demander l'aide pour une requête qui part en Maximum execution time si quelqu'un pourra m'aider à résoudre mon problème ce sera top.
    Je veux effectuer une requête pour afficher des données sur les clients comme la dernière commande, la dernière connexion, le nom, l'adresse etc... j'ai donc fait cette requête mais elle me renvoie un Maximum execution time.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    $customers_query_raw = "select c.customers_id,
        							  c.customers_lastname,
        							  c.customers_firstname,
        							  c.customers_email_address,
        							  c.customers_gender,
        							  c.customers_dob,
        							  c.customers_telephone,
        							  c.customers_fax,
    								  c.customers_newsletter,
        							  a.entry_company,
        							  a.entry_street_address,
        							  a.entry_postcode,
        							  a.entry_city,
        							  a.entry_state,
        							  a.entry_suburb,
    								  ci.customers_info_date_account_created,
    								  oi.date_purchased,
    								  oi.orders_id,
        							  co.countries_name
     
        							   from " . TABLE_CUSTOMERS . " c left join " . TABLE_ADDRESS_BOOK . " a on c.customers_id = a.customers_id and c.customers_default_address_id = a.address_book_id
        							   left join " . TABLE_COUNTRIES . " co on co.countries_id = a.entry_country_id
    								   left join " . TABLE_CUSTOMERS_INFO . " ci on ci.customers_info_id = c.customers_id
    								   left join " . TABLE_ORDERS . " oi on oi.customers_id = c.customers_id
    								   where c.customers_newsletter=1 and oi.orders_id in (select distinct (oi.orders_id) from " . TABLE_ORDERS . " where oi.customers_id = c.customers_id)
        							   order by oi.orders_id DESC";
        $customers_split = new splitPageResults($HTTP_GET_VARS['page'], MAX_DISPLAY_SEARCH_RESULTS * 4, $customers_query_raw, $customers_query_numrows);
        $customers_query = tep_db_query($customers_query_raw);
    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Commencez par décrire vos tables sous forme CREATE TABLE avec toutes les colonnes et les contraintes
    Donnez nous les index déjà posés.

    Sans cela nous ne pouvons faire que des hypothèses sur du vent !

    A NOTER : distinct n'est pas une fonction. C'est un mot clef d'opérateur. L'écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    distinct (oi.orders_id)
    n'a aucun sens. Je m'étone même que votre SGBDR, dont vous n'avez pas mentionné le nom, le supporte !

    Je voir aussi que vous faites deux jointures sur une même table dont la seconde est en INNER (IN = INNER) ce qui est stupide ! Voici votre requête récrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    select  c.customers_id,
    		c.customers_lastname,
    		c.customers_firstname,
    		c.customers_email_address,
    		c.customers_gender,
    		c.customers_dob,
    		c.customers_telephone,
    		c.customers_fax,
    		c.customers_newsletter,
    		a.entry_company,
    		a.entry_street_address,
    		a.entry_postcode,
    		a.entry_city,
    		a.entry_state,
    		a.entry_suburb,
    		ci.customers_info_date_account_created,
    		oi.date_purchased,
    		oi.orders_id,
    		co.countries_name
    from  TABLE_CUSTOMERS  c 
          left join TABLE_ADDRESS_BOOK  a 
               on c.customers_id = a.customers_id 
                  and c.customers_default_address_id = a.address_book_id 
          left join TABLE_COUNTRIES co 
               on co.countries_id = a.entry_country_id
    	  left join TABLE_CUSTOMERS_INFO ci 
               on ci.customers_info_id = c.customers_id
          left join TABLE_ORDERS oi 
               on oi.customers_id = c.customers_id
          inner join TABLE_ORDERS o
               on oi.orders_id = o.orders_id
               AND oi.customers_id = c.customers_id
    where c.customers_newsletter = 1 
    order by oi.orders_id DESC
    A +

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci pour ton aide c'est sympas, je précise que mon niveau en SQL est faible, et que je suis en MySQL 4.1.9-max (Easy Php version 1.8), je te met la configuration des tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    Table customers
    customers_id  int(11)     Non    auto_increment              
    customers_gender  char(1) latin1_swedish_ci   Non                  
    customers_firstname  varchar(32) latin1_swedish_ci   Non                  
    customers_lastname  varchar(32) latin1_swedish_ci   Non                  
    customers_dob  datetime     Non  0000-00-00 00:00:00                
    customers_email_address  varchar(96) latin1_swedish_ci   Non                  
    customers_default_address_id  int(11)     Non  0                
    customers_telephone  varchar(32) latin1_swedish_ci   Non                  
    customers_fax  varchar(32) latin1_swedish_ci   Oui  NULL                
    customers_password  varchar(40) latin1_swedish_ci   Non                  
    customers_newsletter  char(1) latin1_swedish_ci   Oui  NULL  
     
    Table address_book
    address_book_id  int(11)     Non    auto_increment              
    customers_id  int(11)     Non  0                
    entry_gender  char(1) latin1_swedish_ci   Non                  
    entry_company  varchar(32) latin1_swedish_ci   Oui  NULL                
    entry_firstname  varchar(32) latin1_swedish_ci   Non                  
    entry_lastname  varchar(32) latin1_swedish_ci   Non                  
    entry_street_address  varchar(64) latin1_swedish_ci   Non                  
    entry_suburb  varchar(32) latin1_swedish_ci   Oui  NULL                
    entry_postcode  varchar(10) latin1_swedish_ci   Non                  
    entry_city  varchar(32) latin1_swedish_ci   Non                  
    entry_state  varchar(32) latin1_swedish_ci   Oui  NULL                
    entry_country_id  int(11)     Non  0                
    entry_zone_id  int(11)     Non  0    
     
     
    Table countries
    countries_id  int(11)     Non    auto_increment              
    countries_name  varchar(64) latin1_swedish_ci   Non                  
    countries_iso_code_2  char(2) latin1_swedish_ci   Non                  
    countries_iso_code_3  char(3) latin1_swedish_ci   Non                  
    address_format_id  int(11)     Non  0   
     
    Table customers_info
    customers_info_id  int(11)     Non  0                
    customers_info_date_of_last_logon  datetime     Oui  NULL                
    customers_info_number_of_logons  int(5)     Oui  NULL                
    customers_info_date_account_created  datetime     Oui  NULL                
    customers_info_date_account_last_modified  datetime     Oui  NULL                
    customers_info_source_id  int(11)     Non  0                
    global_product_notifications  int(1)     Oui  0               
     
    Table orders
    orders_id  int(11)     Non    auto_increment              
    customers_id  int(11)     Non  0                
    ...              
    date_purchased  datetime     Oui  NULL                
    ...
    J'ai modifier la requête avec tes indications et j'ai rajouté un group by oi.customers_id pour ne pas avoir de doublon pour les clients qui ont plusieurs commandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    select c.customers_id,
        							  c.customers_lastname,
        							  c.customers_firstname,
        							  c.customers_email_address,
        							  c.customers_gender,
        							  c.customers_dob,
        							  c.customers_telephone,
        							  c.customers_fax,
    								  c.customers_newsletter,
        							  a.entry_company,
        							  a.entry_street_address,
        							  a.entry_postcode,
        							  a.entry_city,
        							  a.entry_state,
        							  a.entry_suburb,
    								  ci.customers_info_date_account_created,
    								  oi.date_purchased,
    								  oi.orders_id,
        							  co.countries_name
     
        							   from " . TABLE_CUSTOMERS . " c left join " . TABLE_ADDRESS_BOOK . " a on c.customers_id = a.customers_id and c.customers_default_address_id = a.address_book_id
        							   left join " . TABLE_COUNTRIES . " co on co.countries_id = a.entry_country_id
    								   left join " . TABLE_CUSTOMERS_INFO . " ci on ci.customers_info_id = c.customers_id
    								   left join " . TABLE_ORDERS . " oi on oi.customers_id = c.customers_id 
    								   inner join " . TABLE_ORDERS . " o on oi.orders_id = o.orders_id and oi.customers_id = c.customers_id
    								   where c.customers_newsletter = 1
    								   group by oi.customers_id
    								   order by o.orders_id DESC";
    Mon dernier soucis c'est que je voudrais qu'il récupère la date de dernière commande, actuellement il prend la première entrée c'est à dire la date de la première commande. j'avais essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    where c.customers_newsletter = 1 and o.orders_id = (select distinct o.orders_id from " . TABLE_ORDERS . " order by o.orders_id DESC)
    Mais ca ne marche pas.
    Si quelqu'un peut me mettre sur la piste ce serait coolos

Discussions similaires

  1. [phpMyAdmin] problème avec une requête sql (Maximum execution time)
    Par med125 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 14/10/2012, 16h17
  2. Réponses: 4
    Dernier message: 20/11/2008, 09h47
  3. [phpMyAdmin] maximum execution time 300 seconds - Je n'en veux plus
    Par lodan dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 30/08/2006, 11h09
  4. Réponses: 4
    Dernier message: 21/07/2006, 15h33
  5. Réponses: 5
    Dernier message: 19/05/2006, 10h38

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