Select sur plusieurs tables

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 : Select sur plusieurs tables

par Vikchill » 11 oct. 2006, 12:28

La solution du UNION que j'avais déjà évoqué me semble aussi une bonne alternative.
Vikchill : oui, il faudra distinguer de quel table provient le champ.

Maintenant le fait qu'on fasse une recherche sur des champs nom de tables différentes, justifie la question que j'ai posé plus haut: Que représente les deux tables, ont-elles la même structures ? On va dire que comme SAEVEAS, je me pose des questions sur la structure de la base de donnée.
(Pour un exemple rapide: si on a un magasin avec 5 rayons, on ne va pas avoir une table par rayon pour stocker les articles, qu'ils contiennent, mais bien une seul table, on pourra donc facilement rechercher un article, et ce sur une seule table)
On est bien d'accord, tout le monde demande des éclaircissements :p

par pascaltje » 11 oct. 2006, 11:35

une union dans ce genre me semble indiquée:

Code : Tout sélectionner

SELECT id, nom, 'table1' AS table_origine FROM table1 WHERE nom LIKE "critere%" UNION SELECT id, nom, 'table2' AS table_origine FROM table2 WHERE nom LIKE "critere%" UNION ...
comme ça tu as le nom, l'id et tu sais de quelle table ça vient.

A+

Pascal

par iclo » 11 oct. 2006, 09:53

Vikchill : oui, il faudra distinguer de quel table provient le champ.

Maintenant le fait qu'on fasse une recherche sur des champs nom de tables différentes, justifie la question que j'ai posé plus haut: Que représente les deux tables, ont-elles la même structures ? On va dire que comme SAEVEAS, je me pose des questions sur la structure de la base de donnée.
(Pour un exemple rapide: si on a un magasin avec 5 rayons, on ne va pas avoir une table par rayon pour stocker les articles, qu'ils contiennent, mais bien une seul table, on pourra donc facilement rechercher un article, et ce sur une seule table)

par Vikchill » 11 oct. 2006, 09:31

Si les noms dans les deux tables sont identiques il me semble que tu dois ajouter la correspondance entre les deux tables.

Code : Tout sélectionner

SELECT * FROM `table1_fr`,`table2_fr` WHERE `nom` LIKE '%TEST% ' AND table1_fr.nom = table2_fr.nom
Dans tout les cas ta base semble souffrir d'un défaut de conception. L'objectif d'une base de donnée et de garantir l'intégrité mais aussi l'unicité des informations qu'elle contient. Fait le schéma complet de ta base et viens nous la soumettre sur le forum conception ^^.
Je pense que le moteur SQL répondra que le champ 'nom' n'est pas unique, même avec la jointure. De plus, yellcard aimerait trouver '%test%' même si table1_fr.nom et table2_fr.nom sont différent, si j'ai bien compris, d'où le problème de jointure.

par fred9999 » 11 oct. 2006, 08:51

En fait je voulais dire le champ nom :oops:

par iclo » 10 oct. 2006, 20:13

les deux tables ont la même structure ?

par SAEVEAS » 10 oct. 2006, 17:52

Si les noms dans les deux tables sont identiques il me semble que tu dois ajouter la correspondance entre les deux tables.

Code : Tout sélectionner

SELECT * FROM `table1_fr`,`table2_fr` WHERE `nom` LIKE '%TEST% ' AND table1_fr.nom = table2_fr.nom
Dans tout les cas ta base semble souffrir d'un défaut de conception. L'objectif d'une base de donnée et de garantir l'intégrité mais aussi l'unicité des informations qu'elle contient. Fait le schéma complet de ta base et viens nous la soumettre sur le forum conception ^^.

par Vikchill » 10 oct. 2006, 16:34

En fait, tu voudrais avec un seul WHERE tester un champ qu'on retrouve dans plusieurs tables? Je pense pas que ça soit possible en SQL, il faut bien que tu fasse une série de OR, la BD ne sait pas s'y retrouver sans ça. Dans ton esprit, il s'agit d'un même champs, mais une machine ne voit que ce qu'on lui donne: des champs différents, donc table.nom et table2.nom sont différents.

Comme dit, prends garde à tes jointures. Peut-être pourrais-tu nous dire le but d'une telle requête, je trouve ça assez étonnant comme démarche. Un UNION pourrais peut-être être une solution, mais ça sens un peu la base mal conçue..
le nom de ta 1ere table est le meme que celui de ta 2ème???
Euh, t'es sûr que c'est possible ça? :roll:

par fred9999 » 10 oct. 2006, 16:05

le nom de ta 1ere table est le meme que celui de ta 2ème???

par yellcard » 10 oct. 2006, 14:19

hmmm

oui effectivement,
mais alors comment faire pour tester le champ nom dans chaque de mes table de facon plus efficaces ?

par fred9999 » 10 oct. 2006, 14:16

salut
je pense pas que ça sois faisable
de plus il te manque ta jointure
dans ta 2 eme requete

Select sur plusieurs tables

par yellcard » 10 oct. 2006, 14:09

Bonjour à tous,

avant de vous exposer mon pb voici la structure des tables concernées :

table1_fr

id | sigle | nom | form | ....


table2_fr
id | nom | ident | ....


Alors voici mon problème... Je voudrai faire un requête de ce type :

SELECT * FROM `table1_fr`,`table2_fr` WHERE `nom` LIKE '%TEST% '

Sauf qu'évidement, ca ne fonctionne pas puisque la bonne syntaxe doit être :
SELECT * FROM `table1_fr`,`table2_fr` WHERE `table1_fr.nom` LIKE '%TEST% 'OR `table2_fr.nom` LIKE '%TEST% '


Mais cet exemple est fait sur deux tables avec un seul champ mais dans ma requête réelles j'ai 4 tables et bcp de champ à tester... La syntaxe devient très vite lourde...
Auriez vous une solution pour alléger ma requête afin qu'elle ressemble plus à quelque chose comme la première que j'ai écrite ?


Merci d'avance


Yellcard