[MySQL] SELECT Multiple -> Problème !

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [MySQL] SELECT Multiple -> Problème !

par Cyrano » 25 févr. 2006, 18:55

Un peu sur le net et j'ai trois pavés sur le SQL, de quoi se noyer dans les requêtes les plus tordues :P

par wizardman » 25 févr. 2006, 18:53

Maintenant j'ai fait une fonction qui me renvoit le nombre d'enregistrements en fonction des paramètres que je lui donne : ca me prend 4 lignes :)

Pour comprendre, t'a prit un bouquin ou tu a un tuto sur le net ?

par KevBrok » 25 févr. 2006, 18:51

Tu peux t'informer sur les jointures ici: http://dev.mysql.com/doc/refman/5.0/fr/join.html

Je te conseilles de lire cet article, car je les trouve très utiles ces jointures :)

par Cyrano » 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;

par wizardman » 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 :)

par Cyrano » 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 ?

par wizardman » 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é.

par Cyrano » 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;

par wizardman » 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.

par Cyrano » 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'

par ryu007 » 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

par wizardman » 25 févr. 2006, 16:46

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

par Cyrano » 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

par wizardman » 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.

par Cyrano » 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.