2 番目のクエリ ( $products_query
) には、既に結合があります。
2 つのテーブル名 (products と products_description) の間のコンマは結合演算子です。
これは、コンマ結合演算子を theJOIN
キーワードに置き換え、結合述語を ON 句に再配置して書き直すことができます。
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
これは「内部」結合であり、p.manufacturers_id = 1
(少なくとも 1 つの) テーブルに一致する行が存在しproducts
、かつ、products_description テーブルにproducts_id
一致する値を持つ行が少なくとも 1 つある場合にのみ、行が返されます。 products テーブルから返された 1 つまたは複数の行。
INNER
キーワードの前にキーワードを追加してJOIN
もステートメントは変更されず、効果はありません。
これらのテーブルの内容を考えると:
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
そのクエリは次を返します。
p.products_id pd.products_description
222 foo
444 fee
444 fi
444 fo
444 fum
LEFT
キーワードの前にJOIN
キーワードを追加するOUTER
と、クエリは結合になり、クエリは次のような行も返します。
p.products_id pd.products_description
333 (NULL)
JOIN の左側のテーブルの行には、右側のテーブルに一致する行が見つかりません。
行を特定の順序で返したい場合は、クエリの最後に ORDER BY 句を含めます。次に例を示します。
ORDER BY p.products_id, pd.product_description
それがなければ、MySQL は任意の順序で自由に行を返すことができます。
キーワードINNER
とOUTER
は完全にオプションです。ステートメントの処理方法には影響しないため、ほとんどの SQL 開発者はこれらのキーワードを省略します。
ALEFT JOIN
はOUTER
結合です。右側のテーブルに一致する行が見つからない場合でも、左側のテーブルから行が返されます。
(クロス結合の場合CROSS
、ON 句の省略が意図的であることを示すドキュメントとして機能するという理由だけで、効果はありませんが、通常はキーワードを含めます。)
mysql_fetch_array への呼び出しはループ内にある必要があります。
$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>';
}
mysql_ インターフェイスは非推奨です。新しい開発では、mysqli_ または PDO インターフェイスのいずれかを使用する必要があります。