Php 从多个表检索数据

Php 从多个表检索数据,php,mysql,select,join,Php,Mysql,Select,Join,我有3个表,想写选择结果,但我不知道如何使用“连接”“内部”“外部”等,如果有人帮助我,我将不胜感激 表:制造商/产品/产品描述 $manufacturer_query = "SELECT manufacturers_id from manufacturers WHERE manufacturers_name='" . $m ."'"; $manufacturer = mysql_query($manufacturer_query); $mresult = mysql_fetch_array($

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

尝试使用内部连接

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

对于第二个查询$products\u查询,您已经有了一个联接

两个表名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
这是一个内部联接,仅当products表中至少有一行与p.manufacturers_id=1匹配,并且products_description表中至少有一行在products_id中的值与products表中返回的一行或多行匹配时,才会返回p.manufacturers_id=1的行

在JOIN关键字之前添加关键字INNER不会更改语句,它没有任何效果

鉴于这些表格内容:

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
如果在JOIN关键字之前添加LEFT关键字,则查询将是外部联接,并且查询还将返回一行,如:

p.products_id  pd.products_description  
333            (NULL)
其中,联接左侧表中的行在右侧表中找不到匹配行

如果希望按特定顺序返回行,请在查询末尾包含ORDER BY子句,例如:

ORDER BY p.products_id, pd.product_description
如果没有这一点,MySQL可以自由地以任意顺序返回行

关键字INNER和OUTER是完全可选的。它们对语句的处理方式没有影响,这就是大多数SQL开发人员忽略这些关键字的原因

左连接是外部连接。即使在右侧的表中找不到匹配的行,也会从左侧的表返回行

对于交叉连接,我们通常包含cross关键字,即使它没有效果,只是因为它用作文档,说明省略ON子句是故意的

对mysql_fetch_数组的调用应该在循环中:

$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_uu接口已弃用。新开发应该使用mysqli_u2;或PDO接口。

。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果您选择PDO,。请看一看。如果您能解释一下您的表结构以及您要查找的查询结果,我将非常有帮助。@MikeBrant基本上,该结构很容易理解。制造商表给出了我认为不需要加入的产品制造商,产品和产品描述应与它们的产品标识相匹配,这对两者都是通用的,并且在产品的制造商标识与制造商表中的标识相匹配的情况下进行选择。我只需要写下结果,因为我把它放在一个while条件中,我也不知道它是否正确;看起来您的代码将只获取第一行。看看我的答案。强调尼尔在上面的评论。。。不要使用mysql函数。回应Mike Brant的评论:指定期望返回的结果集将大大有助于找出返回该结果集的查询。不起作用。我试着把m.U的名字放在查询的末尾,还把$prod改为$presult,虽然还没用,解释得很好,但还是没用。我试图修改一些行,但什么也没发生p、 product_id'和'pd.products_description'返回零,而'while'进入无限循环。将调用移动到while条件内循环内的mysql_fetch_数组应该可以解决无限循环问题。我编辑了我的答案,将其包括在内;你在发表评论时一定没有看到。实际上没有无限循环是的,我已经更正了,但是没有显示p.products\u id和pd.products\u description。echo没有显示数据的问题在于数组索引常量的值。这些索引值要么需要是数字,要么需要与结果集中列的名称匹配。数组的内容应该被引用,例如$prod[0]和$prod[1],或者$prod['products_id']和$prod['products_description'],'while'正确返回700个值$c,这意味着产品在查询中,但id和描述都没有显示,尽管它们都匹配为数值和列名。还有别的想法吗?
$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>';
}