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

Requêtes MySQL Discussion :

Requête POSTGRE en MYSQL trop longue


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut Requête POSTGRE en MYSQL trop longue
    Bonjour à tous,

    Alors voila je dois réécrire des requêtes POSTGRE en MYSQL, après modification en MYSQL celle-ci tourne dans le vide sans me retourner de résultat.

    Il y a deux BDD clients ( 2 millions d'entrées ) et tickets ( 200 000 entrées )

    Voici la requête en POSTGRE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 1 FROM clients AS Clients, tickets AS Tickets 
     
    WHERE Tickets.client_id = Clients.client_id 
     
    AND CASE WHEN is_cb THEN 'zzz_CB-' ELSE '' END || Tickets.label = CASE WHEN is_cb THEN 'zzz_CB-' ELSE '' END || Clients.label 
     
    AND Clients.cat = '......' 
     
    HAVING to_char( MIN(Clients.created_at), 'YYYYMMDDHH24') = to_char(Tickets.date, 'YYYYMMDDHH24')
    voici la requête en MYSQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 1 FROM clients AS Clients, tickets AS Tickets 
     
    WHERE Tickets.client_id = Clients.client_id AND 
     
    CASE WHEN is_cb = '0' THEN 'zzz_CB-' ELSE CONCAT('',Tickets.label) END = CASE WHEN is_cb = '0' THEN 'zzz_CB-' ELSE CONCAT('',Clients.label) END 
     
    AND Clients.cat = '......'
     
    HAVING DATE_FORMAT( MIN(Clients.created_at) , 'YYYYMMDDHH') = DATE_FORMAT( 'Tickets.date' , 'YYYYMMDDHH')
    "created_at" et "date" sont de type DATETIME avec des valeurs comme "2011-01-11 23:31:59" et cette requête est imbriqué dans une fonction EXISTS () d'une autre qui elle ne pose pas de problème.

    Pouvez m'aider à trouver pourquoi la requête tourne en boucle, je suis aussi preneur d'éventuelle modification de requête.

    Merci.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 067
    Par défaut
    Salut,

    Dans le HAVING de la requête sous MySQL, la date de ticket est entre quote au lieu d'être entre `.
    Au passage, profites-en pour écrire les jointures de manière normalisée.
    Autre remarque, les alias ne servent à rien, vu qu'ils sont identiques au nom de la table.
    Essaie la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 1 
    FROM clients AS c
    INNER JOIN tickets AS t ON c.client_id = t.client_id
    WHERE CASE WHEN is_cb = '0' THEN 'zzz_CB-' ELSE CONCAT('', t.label) END = CASE WHEN is_cb = '0' THEN 'zzz_CB-' ELSE CONCAT('', c.label) END 
    AND c.cat = '......'
    HAVING DATE_FORMAT(MIN(c.created_at) , 'YYYYMMDDHH') = DATE_FORMAT( t.`date` , 'YYYYMMDDHH')
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Postez un plan d'exécution ...

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Voici la requête en entier :

    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
     
    SELECT Tickets.thour AS n, 
     
    CASE WHEN is_cb = '0' THEN 'zzz_CB-' ELSE CONCAT('',Tickets.label) END AS table_id;
     
    COUNT(DISTINCT(Tickets.client_id)) AS nvx_clients,
     
    COUNT(Tickets.client_id) AS nvx_consult 
     
    FROM tickets AS Tickets 
     
    WHERE Tickets.tyear = '2011' 
    AND Tickets.tmonth = '7'
    AND Tickets.tday = '5' 
    AND Tickets.cat = '......' 
     
    -- AND EXIST( "emplacement de la requête concerné") --
     
    GROUP BY n ,table_id ORDER BY table_id ,n

    Qu'est-ce que vous entendez par "plan d’exécution" par ce que je n'arrive pas à lancer la requête avec un EXPLAIN devant, ça tourne en boucle et rien ne s'affiche.

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Autre précision pour la colonne date de la BDD tickets

    Field date
    Type timestamp
    Null NO
    Key MUL
    Default CURRENT_TIMESTAMP
    Extra on update CURRENT_TIMESTAMP

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Autant pour moi la requête

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    EXPLAIN SELECT 1 
    FROM clients AS c
    INNER JOIN tickets AS t ON c.client_id = t.client_id
    WHERE CASE WHEN is_cb = '0' THEN 'zzz_CB-' ELSE CONCAT('', t.label) END = CASE WHEN is_cb = '0' THEN 'zzz_CB-' ELSE CONCAT('', c.label) END 
    AND c.cat = '......'
    HAVING DATE_FORMAT(MIN(c.created_at) , 'YYYYMMDDHH') = DATE_FORMAT( t.`date` , 'YYYYMMDDHH')

    m'affiche ceci :

    id 1 1
    select_type SIMPLE SIMPLE
    table c t
    type ref ALL
    possible_keys client_id,cat,detail,nvx NULL
    key cat NULL
    key_len 1 NULL
    ref const NULL
    rows 10 2550330
    Extra Using where with pushed condition Using where; Using join buffer

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/09/2009, 12h10
  2. Réponses: 1
    Dernier message: 20/03/2008, 12h22
  3. Réponses: 5
    Dernier message: 29/11/2006, 11h28
  4. Exécution trop longue d'une requête
    Par lodan dans le forum Requêtes
    Réponses: 5
    Dernier message: 13/10/2006, 16h34
  5. [MySQL] Requête trop longue ?
    Par Thomas1434 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 24/03/2006, 22h55

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