-2

我有 3 个表,想写选择结果,但我不知道如何使用 'join' 'inner' 'outer' 等,如果有人帮助我,将不胜感激。

表格:制造商/产品/产品描述

$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

用 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 回答
0

对于您的第二个查询 ( $products_query),您已经有一个联接。

两个表名(products 和 products_description)之间的逗号是连接运算符。

这可以重写,用JOIN关键字替换逗号连接运算符,并将连接谓词重新定位到 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只有当表中存在(至少一个)行products匹配该行,并且如果 products_description 表中至少有一行具有products_id匹配的值时,才会返回该行从 products 表返回的一行(或多行)。

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 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 接口。

于 2012-12-24T17:01:35.533 回答