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.
[** 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
Jetez un oeil à http://www.sitepoint.com/understanding-sql-joins-mysql-database/ – DWright
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. –