Page 1 sur 1

lire sur plusieurs tables .....

Posté : 26 sept. 2012, 10:52
par timinol
slt tlm,

j'explique la situation:

j'ai une table "salaried" qui contient toutes les données sur des salariés; notamment les champs id,name,firstname et
une autre table "contract" contenant les champs id,cbeg,cstop

dans la table "salaried" sont donc répertoriés tous les salariés avec leurs données respectives, tandis que dans la table "contract" sont repertoriés que les contrats respectifs (étant donné qu'un contrat est en soi quelque-chose de variable (au cas échéant toutes modifications feront du contrat actuel un "historique" (autre table) et le contrat de la table contract sera/restera actif).

le point commun entre les tables est donc le champ "id".

le problème:

je veux afficher un <select> où ne sont donnés QUE les salariés ayant un contrat en cours de validité, cad dans le select ne seront montrés que name,firstname de la table salaried ayant "cstop>='time()' " dans la table contract.

quelle tête aura donc ce SELECT?

merci par avance.

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 10:56
par ouckileou
Tu as presque écrit ta requête là, tu sélectionne les infos dans salaried, INNER JOIN sur la table contract en utilisant leurs colonnes id respectives puis condition dans le WHERE pour filtrer les contrats actifs

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 11:19
par timinol
merci pour ta réactivité ouckileou,

voilà donc ma requête:
SELECT dep, numb, name, firstname, rights FROM salaried WHERE id = '018662' INNER JOIN contract ON cstop <= '1348650596'
et voilà le résultat:
#1064 - 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 'INNER JOIN contract ON cstop<='1348650596'
maintenant tu vas me dire qu'il est temps d'utiliser la méthode RTFM , mais le problème est qu'à moi il faut tout expliquer comme à un gosse de 3 ans. :(

encore une fois, merci par avance.

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 11:34
par xTG
Le INNER JOIN est à placer avant le WHERE.
Car sinon cela voudrait dire d'appliquer le WHERE avant la jointure. ;)

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 11:38
par timinol
tout à fait d'accord avec toi!

c'est pourquoi j'ai essayé:
SELECT dep, numb, name, firstname, rights FROM salaried INNER JOIN contract ON cstop <= '1348650596' WHERE id = '018662'
ce qui me donne comme résultat:
#1052 - Column 'name' in field list is ambiguous

devrais-je en conclure que les tables doivent impérativement être identiques du point de vue de la structure? j'en doute un peu!

QUID???????

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 13:15
par moogli
non cela veux dire que tu a une colonne name dans les deux tables.

ceci dit ce n'est pas une jointure que tu fait la.

Un cours sur les jointures http://sqlpro.developpez.com/cours/sqlaz/jointures/


si la colonne de jointure est name, il faut l'utiliser dans le join et la condition cstop c'est dans le prédicat.

par exemple : SELECT dep, numb, name, firstname, rights FROM salaried JOIN contract using(name) WHERE cstop <= '1348650596' && id = '018662'


@+

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 14:09
par timinol
salut moogli,

comme tu l'indique, j'ai donc utilisé:
SELECT dep, numb, name, firstname, rights FROM salaried JOIN contract USING ( id ) WHERE cstop <= '1348650596' && id = '018662'
avec pour résultat:
#1052 - Column 'name' in field list is ambiguous
si j'enlève donc "name" dans la liste, c'est un autre champ qui prend la place, ce qui ne fait pas avancer le schmilblick! :(

il faut aussi savoir que "id" est le SEUL point commun entre les deux tables. c'est peut-être important à préciser.

pour être précis: il est bien sûr tout-à-fait possible de construire la séléction par un select sur la table "contract" en conséquence d'un mysql_fetch_array() sur la table "salaried", mais ne serait-ce pas tellement plus élégant, voire plus rapide avec UN seul select joignant les deux tables?

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 14:18
par Mazarini
Comme dit Moogli, name est présent dans les 2 tables.

Tu dois donc indiquer le name de quelle table tu utilise comme par exemple salaried.name ou contract.name

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 14:30
par timinol
justement non!

comme je viens de l'écrire: "id" est le SEUL point (champ) commun entre les deux tables! aussi bien le salarié que le contrat s'identifie par son id!

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 14:49
par timinol
voilà donc ma dernière connaissance:
SELECT * FROM salaried JOIN contract USING ( id ) WHERE cstop <= '1348650596' && id = '018662'
ce qui mène en quelque sorte au résultat recherché. le seul inconvénient est que j'ai effectivement TOUS les champs des deux tables réunis, alors que uniquement "dep,numb,name,firstname,rights" de la table "salaried" sont nécessaires.

autre suggestions?

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 14:57
par Mazarini
Commences de toutes facons par mettre le nom de la table devant chaque nom de colonne.

Tu peux aussi remplacer * par salaried.*

Tu peux aussi nous donner la description des tables

Re: lire sur plusieurs tables .....

Posté : 26 sept. 2012, 16:12
par ouckileou
justement non!

comme je viens de l'écrire: "id" est le SEUL point (champ) commun entre les deux tables! aussi bien le salarié que le contrat s'identifie par son id!
Il n'empêche que tu as DEUX colonnes id, une dans chaque table, et tu utilises ces deux tables dans ta requête. Donc quand tu utilises "id" dans ton SQL, MySQL ne sait pas quelle colonne utiliser, celle de la table 1 ou celle de la table 2 ?

Donc comme l'a dit Mazarini, mets le nom de la table devant chaque nom de colonne.

Et un petit RTFM ne serait pas effectivement pas du luxe, si tu colles un message d'erreur dans Google (typiquement "#1052 - Column 'name' in field list is ambiguous") tu auras une explication bien plus vite qu'en postant ici.