SELECT sur plusieurs tables

SELECT sur plusieurs tables - PHP - Programmation

Marsh Posté le 15-01-2004 à 20:01:26    

bon j'ai absolument besoin de faire une requete sur plusieurs tables à la fois avec un argument
j'ai fait ça :
 
SELECT * FROM bat1, devis1 WHERE bat1.id=devis1.id='$id_test' AND bat1.newold=devis1.newold='OLD'
 
ça m'affiche pas d'erreur.. mais visiblement... ça bugge !
 
j'arrive pas à trouver la syntaxe qu'il me faut pour pourvoir interroger à la fois "bat1" et "devis1" avec la même clef etrangère "id" et l'option "OLD"
 
can you help me ?

Reply

Marsh Posté le 15-01-2004 à 20:01:26   

Reply

Marsh Posté le 15-01-2004 à 20:20:47    

C'est quoi cette syntaxe bat1.id=devis1.id='$id_test' ????
 
Essaye une jointure plutôt, style

Code :
  1. select * from bat1
  2. left join devis1 on bat1.id = devis1.id and bat1.newold = devis1.newold
  3. where bat1.id = '$id_text' and bat1.newold = 'OLD'


 
ou
 

Code :
  1. select * from bat1
  2. left join devis1 using (id,newold)
  3. where bat1.id = '$id_text' and bat1.newold = 'OLD'


Message édité par naceroth le 15-01-2004 à 20:22:22
Reply

Marsh Posté le 15-01-2004 à 20:38:03    

naceroth a écrit :

C'est quoi cette syntaxe bat1.id=devis1.id='$id_test' ????
 
Essaye une jointure plutôt, style

Code :
  1. select * from bat1
  2. left join devis1 on bat1.id = devis1.id and bat1.newold = devis1.newold
  3. where bat1.id = '$id_text' and bat1.newold = 'OLD'


 
ou
 

Code :
  1. select * from bat1
  2. left join devis1 using (id,newold)
  3. where bat1.id = '$id_text' and bat1.newold = 'OLD'




 
bah j'ai voulu m'inspirer d'un tutos qui me donnait une synthaxe comme ça :
 
SELECT * FROM table1,table2 WHERE table1.id = table2.id;
 
 
si je fais :
 
SELECT * FROM bat1,devis1 WHERE bat1.id='$id_test' = devis1.id='$id_test' AND bat1.newold=OLD = devis1.newold=OLD;
 
ça veut dire quelquechose ?

Reply

Marsh Posté le 15-01-2004 à 22:11:06    

non, tu peux pas cumuler les comparaisons entre 4 champs.
 
... WHERE bat1.id='$id_test' AND devis1.id='$id_test' AND bat1.newold='OLD' AND devis1.newold='OLD';

Reply

Marsh Posté le 16-01-2004 à 00:28:36    

freed102 a écrit :


ça veut dire quelquechose ?


 
Non, une comparaison, c'est toujours entre 2 éléments.
 
Donc ... = ... and ... = ... etc :)
 
Après, faire des and à ralonge ou des jointures, c'est question de gouts et de circonstances :)

Reply

Marsh Posté le 16-01-2004 à 16:21:11    

bah je comprends pas... mon truc ne sais pas compter !!!
 
avec mysql_num_rows il me repond des trucs incoherents... je m'explique.. j'ai deux tables, bat1 et devis1
et quand je demande les resultats de mes tables il me repond des trucs comme ça :
 
bat1  devis1  resultat
2   +   0    =   0
2   +   1    =   2
2   +   2    =   4
2   +   3    =   6
 
 
allez voir vous même !
 
http://www.clonecopy.net/php/membr [...] 225c172b2d
 
si la session est fermée :
login : xxx@xxx.com
pwd : xxx
 
puis aller dans l'espace membres
 
Faites joujou avec les suppressions de devis et commandes et bat... et vous verrez que le chiffre dans le menu de gauche "x elements historiques" ne veut rien dire !!!
 
pourtant.. ma requete est simple !
 
         

Code :
  1. $req = "SELECT * FROM bat1 , devis1 WHERE bat1.id='$id_test' AND devis1.id='$id_test' AND bat1.newold='OLD' AND devis1.newold='OLD'";
  2.          $result=MYSQL_QUERY($req) or die(mysql_error());
  3.          $total_old=mysql_num_rows($result);


Message édité par freed102 le 16-01-2004 à 16:33:53
Reply

Marsh Posté le 16-01-2004 à 17:33:48    

Bon bah... tant pis !! je la fais à l'ancienne !!! au moins ça marche !!!
 
 
         

Code :
  1. $req = "SELECT * FROM bat1  WHERE id='$id_test' AND newold='OLD'";
  2.          $resultbat=MYSQL_QUERY($req) or die(mysql_error());
  3.          $total_oldbat=mysql_num_rows($resultbat);
  4.          $req = "SELECT * FROM devis1  WHERE id='$id_test' AND newold='OLD'";
  5.          $resultdevis=MYSQL_QUERY($req) or die(mysql_error());
  6.          $total_olddevis=mysql_num_rows($resultdevis);
  7.          $total_old=$total_olddevis+$total_oldbat;


 
là ya plus d'erreur !


Message édité par freed102 le 16-01-2004 à 17:34:08
Reply

Marsh Posté le 16-01-2004 à 17:48:02    

Pourquoi demander à mysql de te renvoyer tous les champs si tu veux justes savoir le nombre de tupples du résultat ? Pourquoi ne pas simplement demander à mysql de la faire lui même, ce qui reduirait les risques de résultats ambigus du à une jointure *douteuse* ?
 
(voir instruction SUM et DISTINCT :))
 
//edit :
 
Le nombre de résultat de la requête  

Code :
  1. SELECT * FROM bat1 , devis1 WHERE bat1.id='$id_test' AND devis1.id='$id_test' AND bat1.newold='OLD' AND devis1.newold='OLD'


n'est pas incohérent, il est au contraire parfaitement logique :
 
bat1  devis1  resultat
2   +   0    =   0      aucun résultat pour devis 1, y en forcément pas non plus pour les deux requêtes mises en commun
2   +   1    =   2
2   +   2    =   4
2   +   3    =   6  
 
Les trois autres cas viennent du fait que tu mélanges 2 tables sans faire de jointures, tous les résultats de l'une sont multipliés par tous les résultats de l'autre (fait un select sans le where pour t'en convaincre, tu auras au total bat1*devis1 résultats :))


Message édité par naceroth le 16-01-2004 à 18:04:11
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed