Requete sur un champ mais plusieurs conditions

Signaler
Messages postés
260
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
5 novembre 2010
-
Messages postés
260
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
5 novembre 2010
-
Bonjour à tous !

Voici mon problème :

j'ai une bdd :

champ1 | champ2

12 | 1
12 | 2
13 | 1
14 | 1

J'aimerais faire une requete qui me selectionne le champ1 dans lequel le champ2 correspond à 1 et 2

Résultat voulu :

resultat
12

Mais je ne sais pas comment construire cette requete...
J'ai essayé des select champ1 from table WHERE champ2=1 or champ2=2 group by champ1
ou select champ1 from table group by champ1 having champ2=1 or champ2=2...
rien a faire, je ne trouve pas...

Quelqu'un a une idée?

Merci

<!-- / message -->







<hr />
lowke<sub>y
</sub>

23 réponses

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

SELECT t.champ1
FROM `table` AS t
INNER JOIN `table` AS t2 ON t2.champ1 = t.champ1 AND t2.champ2 <> t.champ2
Messages postés
260
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
5 novembre 2010
1
Salut malalam !

merci pour ta réponse.
Si au lieu d'avoir deux conditions, j'en ai trente (car en faite le nombre de condition varie en fonction des réponses retournées par une autre requete), il me faudra 30 inner join ?

<hr />
lowke<sub>y
</sub>
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Pas forcément, les conditions dans le inner join peuvent suffire. Il faudrait un exemple ?
Messages postés
260
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
5 novembre 2010
1
Merci pour ta rapidité.

En faite j'ai une requete du style : $marequete=mysql_query(SELECT id FROM table1 WHERE id2=14)
avec la table

table1
id | id2
1  | 14
2  | 14
3  | 14
4  | 14
5  | 14
6  | 15
7  | 15

Donc mes resultats sont 1,2,3,4,5

Ensuite j'ai une table :

table2
c1 | c2
34 | 1
34 | 2
34 | 3
34 | 4
34 | 5
35 | 1
35 | 2
35 | 3
35 | 4
35 | 5
36 | 1
37 | 1
37 | 2

Et donc je voudrais que ça me sorte tous les champs c1 (groupés) qui ont 1,2,3,4,5 en c2.

Le résultat ici serait 34,35

La requete devrait ressembler à
SELECT t1.c1
FROM `table2` AS t1
INNER JOIN `table2` AS t2 ON t2.c1 = t1.c1 AND t2.c2 <> t1.c2 ??

Il ne faudrait pas un AND ... IN $marequete quelque part ?

J'avoue ne pas du tout etre à l'aise avec les INNER JOIN, LEFT JOIN, et toute cette famille.

Merci pour ton aide

<hr />
lowkey
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
C'est très différent de ton 1er exemple ça ?

SELECT t2.c1
FROM table2 t2
INNER JOIN table1 t1 ON t1.id = t2.c2
WHERE t1.id2 = 14
GROUP BY t2.c1
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Si je puis me permettre, tu devrais utiliser pour tes clefs étrangèes le même nom dans ta table secondaire qu'elles ont dans leur table primaire (table2 : id pour le second champ).
Mais bon, comme c'est un exemple...:-)
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
En gros, une structure correcte serait :
table 1:
t1_id, t1_c2

table2
t2_c1, t1_id

ce serait plus simple pour monter les requêtes et les comprendre au premier coup d'oeil.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Au passage, quand tu peux éviter les IN, évite les...c'est très pratique, mais c'est aussi très lent. Et il y a une limite au-delà de laquelle ton serveur DB ne saura plus faire la requête, s'il a trop de valeurs dans le IN. Dans le cadre d'une requête dynamique, on ne le voit pas tout de suite, et ça peut avoir de graves conséquences (une de mes applis très importante et très grosse à mon taf a planté à cause de ça, j'ai dû reprendre toutes les requêtes).
Messages postés
260
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
5 novembre 2010
1
Merci pour toutes ces info, j'en prend bonne note.

Le problème pour le inner join, c'est que mes deux tables sont dans des bdd différentes (ma table1 pese 80 Mo a elle toute seule (liste quasi exaustive de tous les artisans de france...)).
Je met carrément les tables avec mes vrais requetes, ça sera plus simple à comprendre

base artisan :
table travail_artisan
id_artisan | id_prestation(correspond au travail de l'artisan)
1             | 12
1             | 16
1             | 48
3             | 12
4             | 23

base chantier :
table artisan:
id | fax | mail | code_postal
1  | xx  | xx    | xxxxx
3  | xx  | xx    | xxxxx
4  | xx  | xx    | xxxxx

Voila pour les bases.

J'ai un tableau avec des nombres : (correspond a ce qu'on retrouve dans artisan.travail_artisan.id_prestation)
$tab_p[1]=12;
$tab_p[2]=16;
$tab_p[3]=48;
...
La taille de ce tableau est inconnue.

J'avais fait quelque chose du genre

SELECT fax,mail, cp FROM chantier.artisan, artisan.travail_artisan WHERE chantier.artisan.id=artisan.travail_artisan.id_artisan WHERE artisan.travail_artisan.id_prestation=12 or artisan.travail_artisan.id_prestation=16 or artisan.travail_artisan.id_prestation=48 group by chantier.artisan.id

mais ça merdait...

<hr />
lowke<sub>y
</sub>
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
je ne comprends pas ton problème : pourquoi me parles-tu de bdd différentes? Là, je n'en vois qu'une.
Et ta requête est foireuse là, mais je doute que ce soit la vraie (il y a 2 fois la clause WHERE dedans).
Prends un cas concret avec ta /tes vraie(s) base(s) et dis moi ce que tu veux obtenir, parce que là, je suis perdu.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Au passage, pour 2 bdd différentes, si ton user a les droits suffisants, il est très facile de faure tes requêtes sur tes 2 bases:

SELECT t2.id
FROM table1 t1
INNER JOIN bdd2..table2 t2 ON t2.id = t1.id
Messages postés
260
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
5 novembre 2010
1
J'ai bien 2 bdd :

base artisan :  <td>db232501401;</td><td>dbo232501401;xxxxxxxxx;xxxx</td><td>.1and1.fr; </td><td>artisan; </td><td>MySQL5.0</td><td><status xmlns= ""> disponible</status></td>
table travail_artisan
id_artisan | id_prestation(correspond au travail de l'artisan)
1             | 12
1             | 16
1             | 48
3             | 12
4             | 23

base chantier : <td>db223752040; </td><td>dbo223752040;xxxxxx; xxxxx.1and1.fr; </td><td>chantier;</td><td>MySQL5.0</td><td> <status xmlns=""> disponible </status> </td>
table artisan:
id | fax | mail | code_postal
1  | xx  | xx    | xxxxx
3  | xx  | xx    | xxxxx
4  | xx  | xx    | xxxxx

ma requete exacte :

SELECT fax,mail, code_postal
FROM db223752040.artisan, db232501401.travail_artisan
WHERE db223752040.artisan.id =db232501401.travail_artisan.id_artisan 
   AND (db232501401.travail_artisan.id_prestation=12 
      or db232501401.travail_artisan.id_prestation=16 
      or db232501401.travail_artisan.id_prestation=48)
    group by db223752040.artisan.id

Ce que je voudrais, c'est avoir le fax/mail/cp de l'artisan qui à pour prestation "TOUTES" celles qui se trouvent dans $tab_p
(
$tab_p[1]=12;
$tab_p[2]=16;
$tab_p[3]=48;
...
)

<hr />
lowkey
Messages postés
260
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
5 novembre 2010
1
$dbhost='xxxxx.1and1.fr';
$dblogin='dbo223752040';
$dbpassword='xxxxxxxx';
$dbname='db223752040';
$bd1=mysql_connect($dbhost,$dblogin,$dbpassword,true);
mysql_select_db($dbname,$bd1);


$dbhost='xxxxx.1and1.fr';
$dblogin='dbo232501401';
$dbpassword='xxxxxxxxx';
$dbname='db232501401';
$bd2=mysql_connect($dbhost,$dblogin,$dbpassword,true);
mysql_select_db($dbname,$bd2);




$tes=mysql_query("
   SELECT t2.fax, t2.cp
      FROM db223752040.artisan as t2
         INNER JOIN db232501401.travail_artisan as t1 ON t1.id_artisan = t2.id
         WHERE t1.id_prestation = 14
           GROUP BY t2.id");
echo mysql_num_rows($tes);

Me retoune un vide alors que j'ai des artisans ayant la prestation 14

Base de données: db223752040 Table: artisan t2


<tr style="CURSOR: pointer">
<td bgcolor="#ffffff" align="center"> </td>
<td bgcolor="#ffffff" nowrap="nowrap"> <label for="checkbox_row_1">id</label> </td> fax cp mail<td bgcolor="#ffffff" nowrap="nowrap"></td><td bgcolor="#ffffff"></td><td style="FONT-SIZE: x-small" bgcolor="#ffffff" nowrap="nowrap"></td><td bgcolor="#ffffff"></td><td bgcolor="#ffffff" nowrap="nowrap"></td><td bgcolor="#ffffff" nowrap="nowrap"></td><td bgcolor="#ffffff" align="center"></td><td bgcolor="#ffffff" align="center"></td><td bgcolor="#ffffff" align="center"></td><td bgcolor="#ffffff" align="center"></td><td bgcolor="#ffffff" align="center"></td><td bgcolor="#ffffff" align="center" nowrap="nowrap"></td></tr>
<tr style="CURSOR: default">
<td bgcolor="#e9f0fa" align="center">
</td>
<td bgcolor="#e9f0fa" nowrap="nowrap">
</td>
<td bgcolor="#e9f0fa" nowrap="nowrap">
</td>
<td bgcolor="#e9f0fa">
</td>
<td style="FONT-SIZE: x-small" bgcolor="#e9f0fa" nowrap="nowrap">
</td>
<td bgcolor="#e9f0fa">
</td>
<td bgcolor="#e9f0fa" nowrap="nowrap">
</td>
<td bgcolor="#e9f0fa" nowrap="nowrap">
</td>
<td bgcolor="#e9f0fa" align="center">
</td>
<td bgcolor="#e9f0fa" align="center">
</td>
<td bgcolor="#e9f0fa" align="center">
</td>
<td bgcolor="#e9f0fa" align="center">
</td>
<td bgcolor="#e9f0fa" align="center">
</td>
<td bgcolor="#e9f0fa" align="center" nowrap="nowrap">
</td>
</tr>
<tr style="CURSOR: default">
<td bgcolor="#bfd4f1" align="center">
</td>
<td bgcolor="#bfd4f1" nowrap="nowrap">
</td>
</tr>


Base de données: db232501401
 
Table: travail_artisan t1
<tr style="CURSOR: pointer"><td bgcolor="#ffffff" align="center"> </td><td bgcolor="#ffffff" nowrap="nowrap"> <label for="checkbox_row_1"></label> </td><td bgcolor="#ffffff" nowrap="nowrap"></td><td style="FONT-SIZE: x-small" bgcolor="#ffffff" nowrap="nowrap"></td><td bgcolor="#ffffff"></td><td bgcolor="#ffffff" nowrap="nowrap"></td><td bgcolor="#ffffff" nowrap="nowrap"></td><td bgcolor="#ffffff" align="center"><label for="checkbox_row_2">id_prestation</td></tr>

<hr />
lowkey
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Voilà ce que j'ai fait (le nommage est mauvais hein, mais dc'est juste pour l'exemple):

bdd test
table travail_artisan
id_artisan, id_prestation
1, 48
1, 16
1, 14
2, 16

bdd test2
table artisan
id_artisan, cp
1, 13000
2, 75000

Et cette requête :
SELECT
t2.cp
FROM test2.artisan t2
INNER JOIN test.travail_artisan t1 ON t1.id_artisan = t2.id_artisan
WHERE t1.id_prestation IN(14,48)
GROUP BY t2.id_artisan

Le résultat retourné est :
13000
Ce qui est correct.
Je ne comprends pas pourquoi ça ne marche pas chez toi? Ta requête me semble correcte. Un truc ne doit pas aller dans la structure de ta base.
Messages postés
260
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
5 novembre 2010
1
Salut malalam

Dans ton exemple, la requete est bonne, mais si la requete est du genre :

SELECT
t2.cp
FROM test2.artisan t2
INNER JOIN test.travail_artisan t1 ON t1.id_artisan = t2.id_artisan
WHERE t1.id_prestation IN(14,48,16)
GROUP BY t2.id_artisan

Le résultat obtenu est :
13000
75000

Mais j'ai pensé peut etre passer par un ALL, mais e ne suis pas sûr que ça marche :

SELECT

t2.cp

FROM test2.artisan t2

INNER JOIN test.travail_artisan t1 ON t1.id_artisan = t2.id_artisan

WHERE t1.id_prestation=ALL(14,48,16)

GROUP BY t2.id_artisan

<hr />lowkeyhttp://s11.bitefight.fr/c.php?uid=45971
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
"Le résultat obtenu est :
13000
75000"

oui, c'est normal ? C'est correct : tu cherches le code postal des artisans réalisant les prestations 14, 48 ou 16. Il y en a deux, donc tu as bien 2 codes postaux? Je ne comprends pas ce que tu veux obtenir lol.
Messages postés
260
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
5 novembre 2010
1
Je veux le cp des artisans qui réalisent les prestations 14, 18 ET 16.(qui réalisent la totalité des prestations données).
C'est pour ça que le ALL pourrait etre utile en remplacement du IN. non?

<hr />lowkeyhttp://s11.bitefight.fr/c.php?uid=45971
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Oui je viens de comprendre.
All ne s'utilise pas comme ça, il ne prend pas de liste de valeurs comme peut le faire IN, il ne prend q'une sous-requête.
Bah faut tester :-)
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Ceci dit, là, tu as en effet besoin de passer par plusieurs join, je pense.
Le ALL ne te sera sans doute pas d'une grande aide. Enfin il faut voir et tester, en fait.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Comme ça quoi :
SELECT t.id_artisan FROM test.travail_artisan tINNER JOIN test.travail_artisan t2 ON t2.id_artisan t.id_artisan AND t2.id_prestation 16INNER JOIN test.travail_artisan t3 ON t3.id_artisan t.id_artisan AND t3.id_prestation 48
WHERE t.id_prestation = 14

Mais il y a sans doute plus simple. Ceci dit, là, je ne vois pas.