bonjour,
j'ai un petit souci avec une requête.
j'ai 2 tables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CLIENT id, nom, code_postal, villele champ type peut prendre 3 valeurs texte (a, b, c)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DATAS id, client_id, type, annee, total
total est une donnée numérique
pour chaque client, j'ai 0 à n lignes dans DATAS où sont stockées dans 'total' des couples uniques client/type/année, si elles existent.
j'ai besoin de récupérer un tableau avec un client par ligne et, pour chaque ligne, le total d'un type déterminé (ici 'a' pour l'exemple) pour chaque année disponible (mettons ici, de 2013 à 2015)
soit en gros les colonnes suivantes :
id, nom, code_postal, ville, 'total du type a en 2013', 'total du type a en 2014', 'total du type a en 2015'
donc, ma requête actuelle :
ça marche... sauf que j'ai environ 1800 clients et 9000 lignes de datas, ça me prend une grosse dizaine de secondes pour avoir mon tableau, et c'est beaucoup trop long !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT id, nom, code_postal, ville ,(SELECT total FROM datas WHERE client_id=id AND type='a' AND annee=2013) as t_2013 ,(SELECT total FROM datas WHERE client_id=id AND type='a' AND annee=2014) as t_2014 ,(SELECT total FROM datas WHERE client_id=id AND type='a' AND annee=2015) as t_2015 FROM clients ORDER BY nom LIMIT 0,20
vous aurez noté que j'ai un LIMIT x,y qui ne m'affiche que 20 lignes par pages (oui, 1800 lignes sur une page, c'est trop ^^ )
j'ai donc une variable GET qui me permet de changer de page.
donc j'ai essayé ce qui suit, ça va beaucoup plus vite en 2 requêtes :
- une qui récupère uniquement les 20 données CLIENT de la page voulue, ce qui me permet de générer une chaine de client_id (1,2,3,...,20)
- la deuxième qui va chercher les données DATAS, avec
(... étant ma chaine obtenue dans la 1ère requête)
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT * FROM datas WHERE type='a' AND client_id IN(...)
j'obtiens un tableau de n lignes, avec 0 à 3 lignes par client_id, selon qu'il existe ou non des couples type/annee pour ce client_id
- enfin, j'assemble les 2 tableaux dans PHP : c'est quasi-instantané.
si ça fonctionne plus vite, youpi, me direz-vous !!!
oui, sauf que j'aimerais pouvoir changer le "ORDER BY nom" en "ORDER BY t_2013" (par exemple), ce qui est possible avec la requête unique, mais pas avec les 2 requêtes.
donc, retour à la requête unique, et ma question : est-elle rédigée comme il faut ? ou il y a t-il une façon plus efficace d'obtenir ce que je veux ?
j'espère que c'est clair, par avance merci pour vos lumières !
Partager