我有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>';
}
答案 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可以按任意顺序自由返回行。
关键字INNER
和OUTER
完全是可选的。它们对语句的处理方式没有影响,这就是大多数SQL开发人员省略这些关键字的原因。
LEFT 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_接口是DEPRECATED。新开发应该使用mysqli_或PDO接口。