我正在学习PHP / MySQL,以通过网站向当地农民提供信息。不幸的是,我遇到了两个看似棘手的障碍,我正在努力克服这些障碍。
我有3个表,“ pro_list”(主键 producer_id ),“ product_list”(主键 product_id )和中间的“ prod_to_prod”(FOREIGN KEYS producer_id 和 product_id )来启用其他两个之间的多对多关系。
这个想法是生成一个 div 元素列表,其中包含从“ pro_list”中获取的信息(例如电话,电子邮件,位置...)以及它们使用“ product_list”从中产生的信息与“ prod_to_prod”建立桥梁(因为一个生产者可以生产许多产品,并且同一产品可以由许多不同的生产者生产)。
我的问题已经开始于生成基础查询,该查询应使用网桥作为参考来返回生产者的优雅列表(即,我希望列表仅显示其 producer_id 具有<在“ prod_to_prod”中与其关联的strong> product_id )。
可以想象,我使用的代码...
<?php
$pagequery="SELECT * FROM pro_list
OUTER JOIN prod_to_prod
WHERE pro_list.producer_id=prod_to_prod.producer_id
LIMIT $offset, $num_of_cells";
$res_pagequery=mysqli_query($conn,$pagequery);
while($proddiv=mysqli_fetch_array($res_pagequery)) {
echo "<div>
...Producer:".$proddiv['prod_firstname']."...
</div>;
}
?>
...返回了一个包含大量重复项的列表,因为许多 producer_id 与“ prod_to_prod”中的不同 product_id 相关联。我已经使用SELECT DISTINCT尝试了多种组合,但到目前为止,我在错误消息中都获得了全部信息。
我什至不知道如何处理扩展查询(即基于关联 pro_list.product_id =在相应的 div 中显示与每个生产者相关的产品名称) prod_to_prod.product_id 和 product_list.product_id = prod_to_prod.product_id 。我的猜测是,我必须使用至少两个SELECT的UNION,但是由于我只能获得重复项或错误,我什至都不敢尝试...
您将如何解决此问题?
答案 0 :(得分:0)
进行(左)外联接时,无论prod_to_prod中是否有匹配的行,您都会为每个产品至少获得一行。您想将其更改为INNER JOIN,这实际上是默认设置-您只需使用JOIN。
如前所述,对于prod_to_prod中的每个匹配项,您将在结果集中获得一行。
如果使用SELECT *
,则将获取所有列,但是由于您不关心prod_to_prod中的任何列,因此可以指定所需的特定列,也可以指定{{1} }这样,DISTINCT对于消除重复项将很有用,或者您可以使用SELECT pro_list.*
为每个生产者获得一行。