Page 1 sur 2
[MySQL] SELECT Multiple -> Problème !
Posté : 25 févr. 2006, 15:50
par wizardman
Bonjour
Alors voici ma requête qui ne veut pas passer :
SELECT u.*, a.COUNT(aqua_id) AS nb_aqua, po.COUNT(poisson_id) AS nb_poissons, pl.COUNT(plante_id) AS nb_plantes FROM site_users u, site_aquariums a, site_poissons po, site_plantes pl WHERE username='test'
MySQL me renvoit ca :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(aqua_id) AS nb_aqua, po.COUNT(poisson_id) AS nb_poissons, pl.COUNT(plante_id) A' at line 1
Tout est bien orthographié, j'ai tout vérifié, donc a mon avis c'est la syntaxe qui est mauvaise, mais je ne trouve pas l'erreur.
Merci de m'éclairer

Posté : 25 févr. 2006, 16:27
par Cyrano
Essaye déjà comme ceci:
Code : Tout sélectionner
SELECT u.*,
COUNT(a.aqua_id) AS nb_aqua,
COUNT(po.poisson_id) AS nb_poissons,
COUNT(pl.plante_id) AS nb_plantes
FROM site_users u, site_aquariums a, site_poissons po, site_plantes pl
WHERE username = 'test'
Mais je ne suis pas certain que tu vas obtenir quelque chose sans une clause GROUP BY

Posté : 25 févr. 2006, 16:31
par ryu007
Il vaudrait pas mieux faire un count par ligne au lieu par colonne ?
Un bon count(*) est plutot préconisé ... (ça te renvoit des doublons sinon ?)
Cordialement
Posté : 25 févr. 2006, 16:38
par Cyrano
Tu peux faire un COUNT sur une seule colonne en supprimant les doublons en faisant:
Mais je ne suis pas certain que c'est exactement ce que cherche notre ami, il n'a rien précisé à ce propos.
Posté : 25 févr. 2006, 16:38
par wizardman
@Cyrano : ca ne marche pas

Je veux bien essayer le GROUP BY, mais je n'ai encore jamais utilisé cette clause.
@ryu007 : je comprend pas ton raisonnement, comment compter le nombre d'enregistrements si tu compte par ligne ?
Merci de vos réponses.
Posté : 25 févr. 2006, 16:42
par Cyrano
"Ça ne marche pas" ou "Il fait un temps superbe", pour moi c'est la même chose : ça patine sur les rails de mon indifférence parce que ça ne veut strictement rien dire qui me soit utile pour que je puisse savoir quoi te répondre de pratique.
Bon, ben ça marche pas : qu'est-ce qui ne marche pas ? As-tu un message d'erreur ? Si oui, lequel ? sinon, il se passe quoi au juste et comment exécutes-tu ton code. On ne fait pas dans la voyance extra-lucide et on ne devine pas ce que tu fais

Posté : 25 févr. 2006, 16:46
par wizardman
@Cyrano : voici l'erreur renvoyée
Column 'username' in where clause is ambiguous
Posté : 25 févr. 2006, 16:52
par ryu007
Ba oui c'est normal !
il faut mettre le nom de ta table en suffixe ou se trouve ton attribut username !
Ou peut-etre son identifiant :
exemple : " from products as p" (products = TABLE)
soit ton champs username : "p.username"
Cordialement
Posté : 25 févr. 2006, 16:53
par Cyrano
Ça veut dire que le champ username existe dans plusieurs des tables sur lesquelles la requête est faite, il faut donc l'aliaser : essaye donc comme ceci:
Code : Tout sélectionner
SELECT u.*,
COUNT(a.aqua_id) AS nb_aqua,
COUNT(po.poisson_id) AS nb_poissons,
COUNT(pl.plante_id) AS nb_plantes
FROM site_users u, site_aquariums a, site_poissons po, site_plantes pl
WHERE u.username = 'test'
Posté : 25 févr. 2006, 16:58
par wizardman
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
Bon apparement je doit utiliser la clause GROUP BY.
Vu que je ne l'ai jamais uitilisé, je n'ai pas très bien compris à quoi elle servait ?
Merci pour vos réponses.
Posté : 25 févr. 2006, 17:06
par Cyrano
Essaye ça:
Code : Tout sélectionner
SELECT u.*,
COUNT(a.aqua_id) AS nb_aqua,
COUNT(po.poisson_id) AS nb_poissons,
COUNT(pl.plante_id) AS nb_plantes
FROM site_users u, site_aquariums a, site_poissons po, site_plantes pl
WHERE u.username = 'test'
GROUP BY a.aqua_id, po.poisson_id, pl.plante_id;
Posté : 25 févr. 2006, 17:21
par wizardman
Aucune erreur mais rien n'est renvoyé
Rectification : Il faut que l'user ai au moins 1 aquarium + 1 poisson + 1 plante pour afficher quelquechose, sinon, rien n'est renvoyé.
Posté : 25 févr. 2006, 17:46
par Cyrano
Alors en fin de compte, ça fonctionne ou pas ? Si tu veux tous les résultats y compris les lignes où il n'y a pas de valeur, donc là ou COUNT() retourne 0, il va falloir faire des jointures gauches... tu sais ce que c'est ?
Posté : 25 févr. 2006, 18:20
par wizardman
Heu.. non je ne sais pas ce que c'est

Je regarde si je trouve quelquechose sur le net...
Au pire je vais faire une série de mysqli_num_rows(), ce sera plus simple, et j'apprendrai mieux MySQL pour les autres fois.
Cependant, si tu as le temps, une brève explication des jointures me serai bénéfique
Merci beaucoup

Posté : 25 févr. 2006, 18:44
par Cyrano
T'expliquer en quelques lignes ce que j'ai mis plusieurs semaines à comprendre, disons que c'est un peu du domaine du rêve. Ce n'est pas tellement propre à MySQL en particulier, c'est du SQL tout court.
Mais il me manque des éléments et en fait, je crois que je sais pourquoi tu n'as pas de résultats : fais donc voir la structures des 4 tables...
Si je pense juste, ta requête devrait ressembler à ça :
Code : Tout sélectionner
SELECT u.*,
COUNT(a.aqua_id) AS nb_aqua,
COUNT(po.poisson_id) AS nb_poissons,
COUNT(pl.plante_id) AS nb_plantes
FROM site_users u
LEFT JOIN site_aquariums a ON u.username = a.username,
LEFT JOIN site_poissons po ON u.username = po.username,
LEFT JOIN site_plantes pl ON u.username = pl.username
WHERE u.username = 'test'
GROUP BY a.aqua_id, po.poisson_id, pl.plante_id;