Grosse lenteur de left join - SQL/NoSQL - Programmation
Marsh Posté le 21-07-2003 à 14:09:51
je pars en transfert de competences la, je risque de pas pouvoir donner de precisions tout de suite :-)
Marsh Posté le 21-07-2003 à 17:00:23
Euh...
Est-ce que tu peux dire exactement ce que tu veux faire ?
Moi chuis très pragmatique, mais aussi terre à terre.
Pour moi, "left join", ça veut rien dire du tout. (d'autant plus que 90% du temps, une bidouille de derrière les fagots évite d'utiliser des instructions lourdes, donc faut pas s'enfermer dans un terme matheux qui ne veux rien dire, juste savoir formuler sa question - à soit-même en premier )
En fait, je vois pas ce que tu récupère dans ta requête quand tu ne prends pas que les cegetel... Y'a pas de montants renseignés ni rien si ?
Marsh Posté le 21-07-2003 à 17:01:18
PS: et préfixe le nom de tes tables dans ta requête, je vois même pas qui est où.
Marsh Posté le 22-07-2003 à 10:17:30
SELECT inv.numero,cg.zone,count(inv.numero),inv.patrimoine,sum(cg.montant) FROM telecom_inv_ligne inv, telecom_cegetel cg
where
inv.numero=cg.id_inst
group by inv.numero, cg.zone
Marsh Posté le 22-07-2003 à 10:29:18
Voila un exemple concret
requete 1
Code :
|
REquete 2
Code :
|
Marsh Posté le 31-07-2003 à 20:06:46
Salut
d apres ce que g compris tu veux ressortir les numeros de la table telecom_inv_ligne (1549) avec ou sans info de l ot table .
Et la requete t en ramene 1899
Y a comme un pb de produit caretesien ou de doublon ds la table
Marsh Posté le 01-08-2003 à 08:49:18
Et ça (no garanty ...)
niveau rapidité ?
SELECT
numero,zone,count(numero),patrimoine,sum(montant)
FROM telecom_inv_ligne inv
where inv.numero not in
(select cg.id_inst from telecom_cegetel)
group by numero, zone
ou
SELECT
numero,zone,count(numero),patrimoine,sum(montant)
FROM telecom_inv_ligne inv
where not exists
(select 'X' from telecom_cegetel
where cg.id_inst = inv.numero )
group by numero, zone
Marsh Posté le 18-08-2003 à 10:16:40
Ma version de Mysql (j'ai mysql si j'ai pas precise) 4.0.13 ne me permet pas de faire ceci malheureusement.
Marsh Posté le 18-08-2003 à 10:24:53
VinKool a écrit : Salut |
Non pas tout a fait car je fais un regroupement par zone chez cegetel.
Par exemple le numero de tel
0800240250 n'apparait qu'une fois dans telecom_inv_ligne.
Mais s'il a passe des appels locales et nationales ma requete le retournera deux fois.
Marsh Posté le 21-07-2003 à 14:07:32
Voila mon probleme.
J'ai deux tables :
-telecom_inv_ligne qui reference toutes nos lignes telephoniques et ou elles sont. (1549 enregistrements)
-telecom_cegetel qui reference tous les appels passés, le montant de la com et kel type d'appel (fixe/mobile/international etc) (52 947 enregistrements)
Le but :
Recuperer le numero, le type d'appel, combien d appels passés, le lieu, la somme.
Si je ne veux ressortir que les infos pour les numeros de telephones se trouvant dans cegetel no soucy :
SELECT numero,zone,count(numero),patrimoine,sum(montant) FROM telecom_inv_ligne inv, telecom_cegetel cg
where
inv.numero=cg.id_inst
group by numero, zone
//547 rows in set (0.65 sec)
La ou ca se complique c'est que j'aurais voulu aussi ressortir les numeros de tel qui n'apparaissent pas dans cegetel
Donc j ai commence par faire ca :
SELECT numero,zone,count(numero),patrimoine,sum(montant) FROM telecom_inv_ligne inv
LEFT JOIN telecom_cegetel cg ON inv.numero=cg.id_inst
group by numero, zone
//1899 rows in set (5 min 51.89 sec)
Ca va pas du tout vous vous en doutez :-)
Voici les explains si vous comprenez quelque chose qui pourrait me servir.
A savoir que numero est clé primaire chez telecom_inv_ligne
et id_inst est index dans telecom_cegetel.