2012-12-24 4 views
-2

J'ai 3 tables, je veux écrire le résultat de la sélection mais je ne sais pas comment utiliser 'join' 'inner' 'outer', etc, serait reconnaissant si quelqu'un m'aide.Récupérer des données à partir de plusieurs tables

Tables: fabricants/produits/products_description

$manufacturer_query = "SELECT manufacturers_id from manufacturers WHERE manufacturers_name='" . $m ."'"; 
$manufacturer = mysql_query($manufacturer_query); 
$mresult = mysql_fetch_array($manufacturer); 

$products_query = "SELECT p.products_id, pd.products_description FROM products p, products_description pd WHERE p.products_id=pd.products_id AND p.manufacturers_id=" . $mresult['manufacturers_id']; 
$products = mysql_query($products_query); 
$presult = mysql_fetch_array($products); 


$c = 0;        
while ($presult){ 
$c++; 
echo $c . ' - ' . $prod['p.products_id'] . ' - '.$prod['pd.products_description'].' - ' . $mresult['manufacturers_id'] . '<br>'; 
} 
+1

[** Veuillez ne pas utiliser les fonctions 'mysql_ *' dans le nouveau code **] (http://bit.ly/phpmsql). Ils ne sont plus maintenus [et sont officiellement obsolètes] (https://wiki.php.net/rfc/mysql_deprecation). Voir la [** boîte rouge **] (http://j.mp/Te9zIL)? En savoir plus sur [* instructions préparées *] (http://j.mp/T9hLWi) à la place, et utiliser [PDO] (http://php.net/pdo) ou [MySQLi] (http://php.net/ mysqli) - [cet article] (http://j.mp/QEx8IB) vous aidera à décider lequel. Si vous choisissez PDO, [voici un bon tutoriel] (http://j.mp/PoWehJ). – Neal

+0

Jetez un oeil à http://www.sitepoint.com/understanding-sql-joins-mysql-database/ – DWright

+1

Je voudrais vous aider grandement si vous expliquer votre structure de table et quel est le résultat de la requête que vous recherchez. –

Répondre

0

Pour votre deuxième requête ($products_query), vous avez déjà avoir une jointure.

La virgule entre les deux noms de tables (products et products_description) est un opérateur de jointure.

Cela peut être réécrit, en remplaçant l'opérateur de jointure par virgule par le mot clé JOIN et en déplaçant le prédicat de jointure dans une clause ON, par exemple.

SELECT p.products_id 
    , pd.products_description 
    FROM products p 
    JOIN products_description pd 
    ON pd.products_id=p.products_id 
    AND p.manufacturers_id = 1 

Ceci est un « intérieur » se joignent à ce que les lignes pour p.manufacturers_id = 1 seront remboursés si (au moins une) ligne existe dans le tableau products qui correspond, et s'il y a aussi au moins une ligne dans la La table products_description dont la valeur est products_id correspond à une ou plusieurs lignes renvoyées à partir de la table products. Ajouter le mot-clé INNER avant que le mot-clé JOIN ne modifie l'instruction, cela n'a aucun effet.

Étant donné ces contenus de table:

TABLE: products 
manufacturers_id products_id 
1     222 
1     333 
1     444 

TABLE: products_description 
products_id products_description 
222   foo  
444   fee 
444   fi 
444   fo 
444   fum 

Cette requête renverrait:

p.products_id pd.products_description 
222   foo  
444   fee 
444   fi 
444   fo 
444   fum 

Si vous ajoutez le mot-clé LEFT avant le mot-clé JOIN, la requête serait un OUTER joindre, et requête retournerait également une ligne comme:

p.products_id pd.products_description 
333   (NULL) 

où une ligne de la table sur le côté gauche de la JOIN n'a pas de ligne correspondante trouvée dans le tableau sur le côté droit.

Si vous voulez que les lignes retournées dans une séquence particulière, inclure une clause ORDER BY à la fin de votre requête, par exemple:

ORDER BY p.products_id, pd.product_description 

Absent que MySQL est libre de renvoyer les lignes dans un arbitraire commande.


Les mots-clés sont INNER et OUTER entièrement facultative. Ils n'ont aucun effet sur la façon dont l'instruction est traitée, et c'est pourquoi la plupart des développeurs SQL omettent ces mots-clés. Un LEFT JOIN est une jointure OUTER. Les lignes seront renvoyées à partir de la table à gauche, même si aucune ligne correspondante n'est trouvée dans la table à droite.

(Pour une jointure croisée, nous ne comprennent généralement le mot-clé CROSS, même si elle n'a pas d'effet, juste parce qu'il sert de documentation que l'omission d'une clause ON est intentionnel.)


Le appel à mysql_fetch_array devrait être dans la boucle:

$products = mysql_query($products_query); 
$c = 0; 
while ($prod = mysql_fetch_array($products)) { 
    $c++; 
    echo $c . ' - ' . $prod['products_id'] . ' - '.$prod['products_description'].' - ' . $mresult['manufacturers_id'] . '<br>'; 
} 

l'interface mysql_ est dépréciée. Le nouveau développement doit utiliser l'interface mysqli_ ou PDO.

+0

Bien expliqué, mais ne fonctionne toujours pas. J'ai essayé de modifier certaines lignes mais rien ne s'est passé. 'p.product_id' et 'pd.products_description' renvoient zéro et 'while' entre dans une boucle infinie. –

+0

déplacer l'appel à 'mysql_fetch_array' à l'intérieur de la boucle (dans la condition while) devrait résoudre votre problème de" boucle infinie ". J'avais édité ma réponse pour inclure ceci; Vous ne devez pas avoir vu cela lorsque vous avez posté votre commentaire. – spencer7593

+0

En fait, il n'y a pas de boucle infinie (oui, j'ai corrigé) mais p.products_id et pd.products_description ne sont pas affichés. –

0

essayer avec INNER JOIN

$manufacturer_query = "SELECT m.manufacturers_id , p.products_id, pd.products_description FROM manufacturers m 
         INNER JOIN products p ON p.manufacturers_id= m.manufacturers_id 
         INNER JOIN products_description pd ON p.products_id=pd.products_id 
         WHERE manufacturers_name='" . $m ."'"; 



$products = mysql_query($manufacturer_query); 
$presult = mysql_fetch_array($products); 


$c = 0;        
while ($presult){ 
$c++; 
echo $c . ' - ' . $prod['p.products_id'] . ' - '.$prod['pd.products_description'].' - ' . $mresult['manufacturers_id'] . '<br>'; 
} 

EDIT

$manufacturer_query = "SELECT m.manufacturers_id mm, p.products_id pp, pd.products_description ppd FROM manufacturers m INNER JOIN 
       products p ON p.manufacturers_id= m.manufacturers_id INNER JOIN 
       products_description pd ON p.products_id=pd.products_id WHERE manufacturers_name='" . $m ."'"; 



    $products = mysql_query($manufacturer_query); 



    $c = 0;        
    while ($presult = mysql_fetch_array($products)){ 
$c++; 
    echo $c . ' - ' . $presult['pp'] . ' - '.$presult['ppd'].' - ' . $presult['mm'] . '<br>'; 
    } 
+0

Ne fonctionne pas. J'ai essayé de mettre m.manufacturers_name à la fin de la requête, a également changé le $ prod en $ preste en mais ne fonctionne toujours pas. –

+0

désolé il y avait quelque chose erreur, essayez maintenant mon édition –

Questions connexes