cs_lowkey
Messages postés260Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 5 novembre 2010
-
15 févr. 2008 à 15:04
cs_lowkey
Messages postés260Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 5 novembre 2010
-
17 févr. 2008 à 17:48
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...
cs_lowkey
Messages postés260Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 5 novembre 20101 16 févr. 2008 à 12:24
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 ?
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 16 févr. 2008 à 13:29
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...:-)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 16 févr. 2008 à 13:35
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).
cs_lowkey
Messages postés260Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 5 novembre 20101 16 févr. 2008 à 15:34
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
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 16 févr. 2008 à 15:43
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.
cs_lowkey
Messages postés260Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 5 novembre 20101 16 févr. 2008 à 15:53
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;
...
)
$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
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.
cs_lowkey
Messages postés260Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 5 novembre 20101 17 févr. 2008 à 11:33
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
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 17 févr. 2008 à 11:59
"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.
cs_lowkey
Messages postés260Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 5 novembre 20101 17 févr. 2008 à 12:05
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?
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 17 févr. 2008 à 12:22
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 :-)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 17 févr. 2008 à 13:20
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.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 17 févr. 2008 à 13:28
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.