begin process at 2012 05 31 16:29:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Base de données

 > 

MySQL

 > 

Rajouter un champ dans un select


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Rajouter un champ dans un select

mardi 12 octobre 2010 à 12:56:59 | Rajouter un champ dans un select

davidbdjt2

Bonjour,

jexplique ce que je souhaite avec un exemple, ca sera plus facile :

jai 2 table : table1, table2

table1
id ...
1
2
3
4

table2
id table1_id ...
1 1
2 1
3 1
4 2
5 2
6 2
7 2
8 3

je voudrais a present faire un SELECT qui me rendrait la table1 avec le nombre doccurence (total) de la table2

table1
id total
1 3
2 4
3 1
4 0

Merci de votre aide !!!

mardi 12 octobre 2010 à 16:26:19 | Re : Rajouter un champ dans un select

neigedhiver

Salut,

Quelque chose dans ce genre :

Code :
SELECT t2.id AS id, count(t1.id) AS nb
FROM table2 t2, table1 t1
WHERE t1.id = t2.id
GROUP BY t2.id
ORDER BY t2.id ASC;


J'ai testé chez moi avec des tables déjà existantes, ça fonctionne. J'ai transposé, normalement... ça devrait fonctionner.

Je profite de ce post pour attirer ton attention sur un point très très important dans la conception de ta base de données.
Dans une BASE DE DONNÉES une donnée ne peut avoir qu'un seul et unique nom. Inversement, dans une BASE DE DONNÉES, un nom de donnée ne peut représenter qu'une seule et unique donnée.
Respecter cette règle permet de garantir l'intégrité de tes données et donc de ta base. Accessoirement, ça te permet de ne pas te mélanger...
Tu ne devrais donc pas avoir plusieurs identifiants qui portent le nom `id`. Et la donnée nommée `id` ne peut représenter qu'un seul champ d'une seule table.

Ne pas suivre cette règle ne fait pas que ça ne fonctionne pas... Le moteur du SGBDR est capable de s'en sortir, avec des messages d'erreur quand il y a ambiguïté. Mais un outil de Reverse Engineering se perdrait dans les données. De même, un outil de conception ne comprendrait rien à ce que tu veux faire.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
mardi 12 octobre 2010 à 16:28:46 | Re : Rajouter un champ dans un select

neigedhiver

Je me rends compte que j'ai peut-être inversé les ID des tables quelque part... J'ai du mal à savoir où, justement à cause du point que je soulève dans mon post précédent : je me suis perdu dans les ID...

Le COUNT doit être exécuté sur les ID que tu souhaites compter dans l'autre table.
Le GROUP BY doit concerner la table qui "contient" l'autre (la table parent quoi).

Je sais pas si c'est clair...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
mercredi 13 octobre 2010 à 05:05:58 | Re : Rajouter un champ dans un select

deithso

Bonjour,

la requête proposer par neigedhiver est correcte, fallait juste appliquer les changements cités dans son 2eme poste ce qui donne :

Code :
SELECT t1.id AS id, count( id_table1 ) AS total
FROM table1 t1, table2 t2
WHERE t1.id = t2.id_table1
GROUP BY t1.id
ORDER BY t1.id ASC



sauf que tu n'auras pas le zéro pour ton id=4;

mercredi 13 octobre 2010 à 05:12:17 | Re : Rajouter un champ dans un select

deithso

j'ai oublié une chose dont j'ai voulu parle, c'est le choix du titre du sujet, ton titre n'a aucune relation avec le contenu, c'est une règle qui est très importante à respecter quand on crée un sujet, ne jamais écrire le titre avant le contenu.

le titre doit être en quelque sort le résumé du contenu, pour que les autres qui vont t'aider, puissent savoir en avance de quoi s'agit-il, ainsi que pour les autres qui cherchent des sujets qui ressemblent le plus à leurs problèmes,

je ne me mini-modo pas, c'est juste un conseil pour tout le monde,

mercredi 13 octobre 2010 à 11:06:18 | Re : Rajouter un champ dans un select

neigedhiver


Moui, en fait on peut avoir le compte 0 :

Je prends un exemple que je viens de tester chez moi :

Code :
table1
id_t1    title
1        cat1
2        cat2
3        cat3
4        cat4
5        cat5

table2
id_t2    id_t1    name
1        1        item1
2        1        item2
3        2        item3
4        1        item4
5        3        item5
6        4        item6
7        4        item7
8        2        item8
Code :


Voici la requête :
Code :
SELECT t1.id_t1, COUNT(t2.id_t1) AS total
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id_t1 = t2.id_t1
GROUP BY t1.id_t1


Résultat :
Code :
id_t1    total
1        3
2        2
3        1
4        2
5        0


Y'a juste un truc que je comprends pas : j'ai fait je sais pas combien d'essais dans tous les sens, j'arrivais pas à avoir la ligne dans laquel le total est 0. Je m'apprêtais à faire un mail à mon frère qui me sert de support niveau 3 en SQL, et j'ai réécrit ma requête pour lui envoyer... Et là, paf, j'avais tout...
Il y a donc peut-être une subtilité à l'ordre dans lequel sont sélectionnées les tables (quelle table est jointe sur l'autre et dans quel sens : LEFT JOIN ou RIGHT JOIN), l'id sur lequel on fait le GROUP BY, ... Le problème c'est que j'arrive plus à avoir une requête qui ne me retourne pas la ligne avec le total 0...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
mercredi 13 octobre 2010 à 13:07:33 | Re : Rajouter un champ dans un select

deithso

mwai j'avais pensé aux jointures, mais j'ai pas testé,

j'ai fait juste e test avec ton code, j'ai changé l'ordre des tables et j'ai eu le résultat sans le 0,

il faut juste faire une jointure right pour ne pas avoir 0 en retour,

Code :
SELECT t1.id, COUNT( t2.id_table1 ) AS total
FROM table1 t1
RIGHT JOIN table2 t2 ON t1.id = t2.id_table1
GROUP BY t1.id


Textes complets
id total
1 3
2 4
3 1
mercredi 13 octobre 2010 à 14:06:40 | Re : Rajouter un champ dans un select

neigedhiver

Ah oui voilà. Suivant la table que l'on joint sur l'autre... Si on joint la table qui ne contient pas l'id sans correspondance sur l'autre, on aura cette ligne qui sortira.
Pour être plus clair, on peut faire un schéma avec les deux tables l'une à côté de l'autre. LEFT JOIN joindra celle de droite sur celle de gauche. On récupèrera alors tous les enregistrements qui collent avec la table de gauche, même si le COUNT doit être 0. Inversement, si un COUNT fait 0, l'id correspondant ne sera pas dans la table, en joignant la table de gauche, celui qui n'apparait pas à droite n'apparaitra pas du tout.
C'est pas très français, ce que je dis, j'ai du mal à faire plus explicite avec des mots...
C'est pour ça qu'inverser l'ordre dans lequel on tape sur les tables ou la nature de la jointure (LEFT ou RIGHT) est équivalent.


Sinon, quand on fait :
Code :
SELECT .....
FROM table1, TABLE2

c'est une jointure. Elle n'est pas explicite, mais c'en est quand même une. Il faut alors utiliser WHERE pour limiter les enregistrements.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
mercredi 13 octobre 2010 à 14:11:25 | Re : Rajouter un champ dans un select

deithso

oui correct , c'est claire ce que tu viens de dire neigedhiver


Cette discussion est classée dans : select, id, rajouter, table2, table1


Répondre à ce message

Sujets en rapport avec ce message

Boucle jointure [ par gabi77 ] BoujourMon probleme est le suivant.J'ai trois table table1, table2, jointure_table1_table2dans jointure_table1_table2 je recupere id_table1 et id_tabl select modifier des qu'on change le select ... [ par plopinou ] Bonjour, voila j'ai un probleme avec mon programme, fin une amelioration que je voudrai faire et quie j'ai deja essaye mais qui fonctionne pas ... Faire une requete a partir d une requete .... [ par OncleDude ] Bonjour, est-il possible de faire: $req = "SELECT id_tache FROM groupe WHERE id_pers=".$mon_id=$_SESSION['id_popeye']; $tab = mysql_query($req); $r pb de delete [ par ninjafury ] Bonjour tout le mondevoilà le message que j'ai execution de la requête impossibleet voici le code que j'utilise/* Récupération des donnée Call to undefined function: select_categories_db() [ par coyote_fx ] Hello à tous,voilà j'ai un petit problème... Mais c'est un peu compliqué... En gros je stocke toutes mes fonctions dans plusieurs fichiers (connect.ph multi select Dynamique power 2 ^^ [ par Teclis01 ] voilà j ai un petit soucis avec ajax là ...en fait je voudrais que l utilisateur utilise des select pour affinner son choix alors je remplis mon premi Somme de deux requetes SQL [ par ephores ] Bonjour à tous ;J'ai deux tables nommé table1 et table2,Chacune ont une rubrique " montant"j'ai crée deux requete chacune donnant le résultat de la s requete sql assez complexe [ par sebmaster001 ] bonjour à tous, je ne suis pas habitué à poster pour demander de l'aide, mais la, le temps presse... je vous remercie donc d'avance de l'aide que v RÉCUPÉRER TOUTES LES VALEURS D'UN SELECT DANS UNE VARIABLE PHP [ par method0 ] methodsalut a tous, Avant tout chose je precise que je suis debutant.et j'espere que mon post sera comprehensibleJe dois implementer des liste deroula [Problème] Mysql & Select ... not in ... [ par shanicot ] Salut, J'essaie de faire fonctionner cette requête sql sur un serveur qui ne prends pas en compte la subrequête après le NOT IN : select *        


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,404 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales