Kytrix | bonjour
voila j'ai un problème que je retourne dans tous les sens depuis quelques temps déja et je ne parviens pas a trouver de solution optimale (entendre rapide)
j'ai 2 table, une avec bcp d'enregistrements d'appels téléphonique(unixTime d'appel, numéro appelé, oppérateur utilisé)
l'autre avec une grille de prix(unixTime de validité du prix, code pays, opperateur,prix)
ce que je cherche c'est a récupérer pour chaque appel le prix qu'il a couté
, en fonction de quand, par quel oppérateur et vers quelle destination.
assez de blabla, voici ou j'en suis arrivé:
Citation :
SELECT CDR.UnixTime, CDR.DestNum, CDR.ReselerID, (SELECT RateTable.Price
FROM RateTable
WHERE RateTable.AreaCode = LEFT(CDR.DestNum,LENGTH(RateTable.AreaCode))
AND RateTable.ReselerID = CDR.ReselerID
AND RateTable.EffectUT < CDR.UnixTime
ORDER BY RateTable.EffectDate DESC, RateTable.AreaCode DESC
LIMIT 0,1) as 'Price'
FROM (SELECT DestNum, UnixTime, ReselerID FROM IPNX_CDR LIMIT 0,100) CDR
ORDER BY CDR.DestNum;
|
le problème est que c'est relativement lent car pour chaque ligne de la table CDR, il génère une sous requette.
j'ai essayé de passer par un JOIN, mais il n'accepte pas la référence a la colone a l'exterieur de la requette (a l'inverse du cas précédant)
Citation :
SELECT IPNX_CDR.UnixTime, IPNX_CDR.DestNum, IPNX_CDR.ReselerID, RT1.AreaCode, RT1.Price
FROM IPNX_CDR
,(SELECT AreaCode, ReselerID, EffectUT
FROM RateTable
WHERE AreaCode = LEFT(IPNX_CDR.DestNum,LENGTH(AreaCode))
AND ReselerID = IPNX_CDR.ReselerID
AND EffectUT < IPNX_CDR.UnixTime
ORDER BY EffectDate DESC, AreaCode DESC
LIMIT 0,1) as RT1
ORDER BY IPNX_CDR.DestNum;
LIMIT 0,100;
|
donc j'ai un cas qui fonctionne mais qui est lent (si je rajoute 1 champ ça m'oblige a rajouter une sous requette)
et l'autre qui ne fonctionne pas.
j'espère profiter de vos conseils
merci.
voir mon 3eme msg pour les tables. Message édité par Kytrix le 02-09-2005 à 10:18:41
|