Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/07/2011, 11h36   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
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 :
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 :
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.
kabil84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 12h14   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
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 :
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 13h33   #3
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Postez un plan d'exécution ...
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 14h50   #4
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
Voici la requête en entier :

Code sql :
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.
kabil84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 15h35   #5
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
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
kabil84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 15h47   #6
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
Autant pour moi la requête

Code sql :
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
kabil84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 16h28   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Dans votre requête entière, il est spécifié :
Code :
1
2
CASE WHEN is_cb = '0' THEN 'zzz_CB-' ELSE CONCAT('',Tickets.label) END AS table_id;
remplacez le point virgule par une simple virgule.

Attention aussi au nommage de vos colonnes !! date est un mot clé réservé SQL.

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 17h03   #8
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
Merci pour vos réponses.

Je vais tester avec un autre nomage pour la colonne "date".
kabil84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h29.


 
 
 
 
Partenaires

Hébergement Web