|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre habitué
![]() Inscription : décembre 2008 Messages : 207 ![]() |
Bonjour,
Il est nécessaire en premier lieu de consulter le schéma (simple) de la bdd concernée ; en pièce jointe. ( displayed_timestamp n'est plus un timestamp mais un datetime ) La requête doit : - Récupérer tous les sites actif ( site_active = 1 ) - La catégorie du site - La concaténation des formats de pub disponibles pour le site - Le nombre de ligne ajoutées hier dans displayed pour chaque site La requête fonctionne sans le dernier critère : Code :
Code :
displayed.displayed_timestamp BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND CURDATE() La table site ne comporte qu'une seule ligne, category, pub_format et available_format quelques unes, tandis que displayed est vide. Je ne comprends pas le comportement de la requête complète. Je voudrais dans la mesure du possible éviter SUM+IF , qui niveau performance laisse VRAIMENT à désirer, alors que la requête est déjà très lourde. Où est le bins ? ^^ |
||
|
|
00
|
|
|
#2 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Comme displayed est vide la requête ne ramène rien. Pour corriger, remontes le filtre dans la condition de jointures en utilisant ON à la place de USING (perso je n'aime pas trop USING mais bon ça n'est qu'un point de vu personnel, USING est bien dans la norme) Code :
LEFT JOIN displayed d ON site.site_id = d.site_id AND d.displayed_timestamp BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND CURDATE() http://cedric-duprez.developpez.com/...fier-group-by/ |
|
|
|
00
|
|
|
#3 | ||
|
Membre habitué
![]() Inscription : décembre 2008 Messages : 207 ![]() |
Tout d'abord merci de m'avoir répondu.
Ensuite, je ne savais pas qu'on pouvait mettre une clause au niveau de la jointure ! Y'a-t-il une différence entre la structure USING et ON ? (hormis que USING est franchement moins Exact, j'ai oublié de mettre les colonnes dans le group by ( comme quoi Zend_Db_Select avait du bon en vérifiant l'intégrité des requêtes :p ) J'ai testé la requête suivante : Code :
|
||
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
USING permet de spécifier la jointure sur une colonne de chaque table lorsque le nom des colonnes de chaque table est identique (ce qui est plutôt une bonne pratique... pour permettre motamment USING ou NATURAL JOIN)
Je ne sais pas s'il est possible de joindre 2 tables sur plusieurs colonnes en utilisant USING, avec ON il n'y a aucun problème. Comme je l'ai dit c'est un point de vu personnel, mais ce que j'aime avec ON c'est que ça force souvent à aliasser les tables, ce qui réduit l'écriture dans les clauses SELECT et WHERE, et a l'énorme avantage de clarifier les requêtes (j'aliasse toujours les colonnes qui ne sont pas communes même si ça n'est pas nécessaire) Mais je ne pense pas que USING empêche les alias, c'est juste qu'ils sont moins souvent utilisés. Après il est possible que je change d'avis dans le futur, car effectivement ça nécessite plus de touche clavier et par exemple je ne code jamais LEFT [EDIT] au fait je ne sais pas si j'étais vraiment clair sur mon explication avec la jointure externe et le filtre WHERE, au cas où, cinephil a publié un article sur son blog a ce sujet : Jointure externe et condition de restriction |
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() Inscription : décembre 2008 Messages : 207 ![]() |
J'ai bien compris ton explication sur la clause WHERE.
Je te remercie pour toutes ces explications & précisions. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com