从多个表中检索数据

时间:2012-12-24 16:23:07

标签: php mysql select join

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

表格:制造商/产品/ 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>';
}

2 个答案:

答案 0 :(得分: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>';
  }

答案 1 :(得分: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开发人员省略这些关键字的原因。

LEFT 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_接口是DEPRECATED。新开发应该使用mysqli_或PDO接口。