-2

3つのテーブルがあり、選択結果を書きたいのですが、「結合」「内部」「外部」などの使い方がわかりません。誰かが私を助けてくれればありがたいです。

テーブル: メーカー / 製品 / 製品の説明

$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>';
}
4

2 に答える 2

0

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 は任意の順序で自由に行を返すことができます。


キーワードINNEROUTERは完全にオプションです。ステートメントの処理方法には影響しないため、ほとんどの SQL 開発者はこれらのキーワードを省略します。

ALEFT JOINOUTER結合です。右側のテーブルに一致する行が見つからない場合でも、左側のテーブルから行が返されます。

(クロス結合の場合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 インターフェイスのいずれかを使用する必要があります。

于 2012-12-24T17:01:35.533 に答える
0

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>';
}

編集

 $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>';
  }
于 2012-12-24T16:46:15.757 に答える