我正在学习PHP / MySQL,通过网站向当地农民提供信息。不幸的是,我遇到了两个看似棘手的障碍,我正在努力克服这些障碍。
我有3个表,'pro_list'(PRIMARY KEY producer_id),'product_list'(PRIMARY KEY product_id)和中间'prod_to_prod'(FOREIGN KEYS producer_id和product_id),以实现其他两个之间的多对多关系。
我们的想法是生成一个div元素列表,其中包含从'pro_list'获取的信息(例如电话,电子邮件,位置...)以及它们产生的内容,来自'product_list',使用他们的桥接'prod_to_prod'(作为一个生产者可以生产许多产品,同一产品可由许多不同的生产商生产)。
我的问题已经开始生成基础查询,它应该返回一个优雅的生产者列表,使用桥接作为参考(即我希望列表只显示其生产者的生产者,其生产者的产品ID与'prod_to_prod'相关联)。 你可以想象,我用的代码......
<?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_ids相关联。我已经使用SELECT DISTINCT尝试了很多组合,但到目前为止,我已经获得了所有错误消息。
我甚至不知道如何处理扩展查询(即显示与相应div中每个生产者关联的产品的名称,基于关联pro_list.product_id = prod_to_prod.product_id AND product_list.product_id = prod_to_prod.product_id。我的猜测是我必须使用至少两个SELECT的UNION,但由于我只是获得重复或错误,我甚至不敢尝试......
你解决这个问题的方法是什么?
当你执行(LEFT)OUTER JOIN时,无论prod_to_prod中是否有匹配的行,每个产品至少会有一行。您想将其更改为INNER JOIN,这实际上是默认值 - 您只需使用JOIN。
正如您所注意到的,您将在prod_to_prod中的每个匹配的结果集中获得一行。
如果您使用SELECT *
,您将获得所有列,但由于您不关心prod_to_prod中的任何列,您可以改为指定所需的特定列,或者您可以指定SELECT pro_list.*
这样做,DISTINCT将有助于消除重复,或者您可以使用GROUP BY pro_list.producer_id
为每个生产者获取一行。