[MySQL] SELECT Multiple -> Problème !

Eléphant du PHP | 78 Messages

25 févr. 2006, 15:50

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 ;)

Mammouth du PHP | 19672 Messages

25 févr. 2006, 16:27

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 :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 27 Messages

25 févr. 2006, 16:31

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
The Joker : "N'avez-vous jamais dansé avec le Diable au clair de lune ?"
Excellent ce Jack Nicholson.

Image Image

Mammouth du PHP | 19672 Messages

25 févr. 2006, 16:38

Tu peux faire un COUNT sur une seule colonne en supprimant les doublons en faisant:

Code : Tout sélectionner

SELECT COUNT(DISTINCT(`nom_du_champ`))...
Mais je ne suis pas certain que c'est exactement ce que cherche notre ami, il n'a rien précisé à ce propos.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 78 Messages

25 févr. 2006, 16:38

@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.

Mammouth du PHP | 19672 Messages

25 févr. 2006, 16:42

"Ç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 :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 78 Messages

25 févr. 2006, 16:46

@Cyrano : voici l'erreur renvoyée
Column 'username' in where clause is ambiguous

Eléphanteau du PHP | 27 Messages

25 févr. 2006, 16:52

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
Modifié en dernier par ryu007 le 25 févr. 2006, 16:54, modifié 1 fois.
The Joker : "N'avez-vous jamais dansé avec le Diable au clair de lune ?"
Excellent ce Jack Nicholson.

Image Image

Mammouth du PHP | 19672 Messages

25 févr. 2006, 16:53

Ç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'
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 78 Messages

25 févr. 2006, 16:58

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.

Mammouth du PHP | 19672 Messages

25 févr. 2006, 17:06

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;
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 78 Messages

25 févr. 2006, 17:21

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é.

Mammouth du PHP | 19672 Messages

25 févr. 2006, 17:46

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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 78 Messages

25 févr. 2006, 18:20

Heu.. non je ne sais pas ce que c'est :oops:
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 :)

Mammouth du PHP | 19672 Messages

25 févr. 2006, 18:44

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... :-k

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;
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: