【问题标题】:MySQL inner join query select from same table multiple timesMySQL内部连接查询多次从同一个表中选择
【发布时间】:2020-10-25 17:31:54
【问题描述】:

我相信我已经正确地形成了这个问题的标题,因为我不确定如何形成它。例如,我在下面总结了我的查询。

我有一个订单表,其中保存了订单详细信息,例如客户 ID、地址和产品 ID,以及连续每个订单的订购数量。因此,多个库存/产品 ID 保存在一行中。

所以我的查询看起来像:这是一个汇总查询,以便于解释我省略了其他各种字段。

SELECT customer.name,customer.address,tbl_order.order_date,tbl_order.product1_id,tbl_order.product2_id,inventory.product1_name,inventory.product2_name 
FROM tbl_order 
INNER JOIN customer ON tbl_order.customer_id = customer.id 
INNER JOIN inventory on tbl_order.product1_id = inventory.id 
INNER JOIN inventory on tbl_order.product2_id = inventory.id 
where  YEAR(tbl_order.order_date)='$year'

所以我的问题是如何根据 tbl_order 中的每个产品 ID 从库存表中获取库存详细信息。我正在运行一个while循环来显示一年的所有数据

while($row=mysqli_fetch_assoc($sql1))

我可以将此查询分为 2 并单独运行库存查询,然后如何组合 while 循环,因为有时当某些产品不在订单表中时也可能存在空查询(取决于订购的订单,而不是全部产品已订购)所以这不起作用

while($row=mysqli_fetch_assoc($sql1)) and ($row1=mysqli_fetch_assoc($inv1)) and ($row2=mysqli_fetch_assoc($inv2)) 

10 种产品一个

【问题讨论】:

  • 这不是一个很好的数据库设计。如果一个订单有多个产品,最好有两个单独的表:一个用于订单,另一个用于订单中的每个产品。
  • 如果每个订单最多可以有 10 个产品,那么在加入客户和库存之前,最好使用 union all 来“规范化”订单 - 这可能不会很快,但您会受到设计的限制。 .
  • 另见关于sql注入以及准备和绑定查询的重要性,并注意函数不能使用索引,因此范围条件会更好
  • 感谢 db design que 的各位,不幸的是,目前无法对 DB 进行更改。 :(

标签: mysql while-loop inner-join


【解决方案1】:

首先,您的数据库设计很糟糕,我建议您规范化您的数据库。

其次,如果您不能重新设计数据库,您可以使用多个带有别名的连接,例如:

SELECT
    customer.name, customer.address, tbl_order.order_date, 
    tbl_order.product1_id, inv1.product1_name,
    tbl_order.product2_id, inv2.product2_name 
FROM tbl_order 
INNER JOIN customer ON tbl_order.customer_id = customer.id 
INNER JOIN inventory AS inv1 ON tbl_order.product1_id = inv1.id 
INNER JOIN inventory AS inv2 ON tbl_order.product2_id = inv2.id 
WHERE  YEAR(tbl_order.order_date)='$year'

【讨论】:

  • 嗨 Slava,感谢您的回答。这是一个很好的方法,但它仅在 product1_id、product2_id、product3_id 在订单表中都有值时才有效。有时只订购了 2 个产品,因此 product3_id , product4_id 可能为 0 在这种情况下查询不返回任何结果。
  • 当 product_ids 有空值时,我能够使用 LEFT JOIN 库存获得结果。再次感谢slava。不幸的是,现阶段无法更改数据库结构。
  • @abey 如果不是现在,什么时候?
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2022-01-18
  • 1970-01-01
  • 2018-02-27
  • 2018-03-30
相关资源
最近更新 更多