php - 从多个表中检索多行

标签 php mysql database-design inner-join multiple-columns

我正在尝试从多个表中检索多行,但我认为我没有以正确的方式执行此操作。该项目有点像一个在线商店,其中有 3 个表:订单、订单详细信息和服务,所有这些都与 ID 链接:

我在 orderdetails 表中有订单 ID 和服务 ID,这意味着我为链接到服务 ID 的购物篮中的每个商品插入一行,以查看哪个服务,以及订单 ID 以检查哪个订单。示例:

services table
-
service_id|name   |price
------------------------
2         |Tech   |100
------------------------
4         |Support|150
------------------------
10        |Mainten|50
------------------------

orders table
-
order_id|customer_id|name|lastname
----------------------------------
10      |16         |John|Smith
----------------------------------

orderdetails table
-
orderdetails_id|order_id|service_id|price|quantity
--------------------------------------------------
1              |10      |2         |100  |4
--------------------------------------------------
2              |10      |4         |150  |2
--------------------------------------------------
3              |10      |10        |50   |1
--------------------------------------------------

我在 orderdetails 表中插入服务的价格,因为服务价格可能会在客户订购后发生变化。

此时我有这样的疑问:

$query = $this->db->prepare(
'SELECT orders.*, orderdetails.*, services.*
FROM  orders
LEFT JOIN orderdetails
ON orderdetails.order_id = orders.order_id
LEFT JOIN services
ON orderdetails.service_id = services.service_id
WHERE orders.order_id = ?
AND orders.customer_id = ?');

我得到了这个结果:

    stdClass Object
(
    [order_id] => 10
    [customer_id] => 16
    [name] => Tech
    [lastname] => Smith
    [orderdetails_id] => 1
    [service_id] => 2
    [price] => 100
    [quantity] => 4
)
stdClass Object
(
    [order_id] => 10
    [customer_id] => 16
    [name] => Support
    [lastname] => Smith
    [orderdetails_id] => 2
    [service_id] => 4
    [price] => 150
    [quantity] => 2
)
stdClass Object
(
    [order_id] => 10
    [customer_id] => 16
    [name] => Mainten
    [lastname] => Smith
    [orderdetails_id] => 3
    [service_id] => 10
    [price] => 50
    [quantity] => 1
)

我有两个问题。第一个问题是我在订单表和服务表中有相同的列名。第二个是查询返回所有信息(因为我知道我查询得不好),但我期望收到这样的信息:

stdClass Object
(
    [order_id] => 10
    [customer_id] => 16
    [name] => John
    [lastname] => Smith
    [orderdetails_id] => 1
    [service_id] => 10
    [price] => 50
    [quantity] => 1
    [service_name] => Mainten
    [orderdetails_id2] => 2
    [service_id2] => 4
    [price2] => 150
    [quantity2] => 2
    [service_name2] => Support
    [orderdetails_id3] => 3
    [service_id3] => 2
    [price3] => 100
    [quantity3] => 4
    [service_name3] => Tech
)

我的意思是,我不是 SQL 查询方面的专家,我读了很多书,但我认为你们可以帮助我解决这个问题,因为我还有其他两个表可以链接:customer-service-worker who将获取要处理的订单以及将接收订单的区域表。

我使用此代码来获取对象:

$array = array(); 
while($loop = $result->fetch_object()){ $array[] = $loop; }
return $array;

最佳答案

问题是您正在使用 fetch_object()为了获得结果,但您没有在查询中重命名具有相同名称的列,并且由于您不能拥有两个具有相同名称的不同对象属性,因此其余列将被丢弃。

您可以使用其他方法来获取值,例如 fetch_row()或者更改查询以重命名具有相同名称的列,例如:

SELECT orders.*, orderdetails_id, service_id, orderdetails.price as detail_price, quantity,
  services.name as service_name, services.price as service_price
FROM orders
LEFT JOIN orderdetails ON orderdetails.order_id = orders.order_id
LEFT JOIN services ON orderdetails.service_id = services.service_id
WHERE orders.order_id = ?


附带说明一下,如果 order_idorders 的主键,则无需在 where 中使用 customer_id > 条件,并且如果主键由两列组成(即,您可以为不同的客户使用相同的订单 ID),我建议更改它并仅使用 order_id

关于php - 从多个表中检索多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47023978/

相关文章:

mysql - 同一个表的多个外键 - Doctrine2

mysql - 对列进行限制的建模数据库

mysql - 基本的内部消息传递数据库设计

php - Magento 如何以编程方式发送订单?

php - 在 WordPress 中循环自定义帖子类型的特定类别

PHP 换行\n 和\r\n 不工作

php - 选择表中与相关表及其字段用户名和密码相匹配的行

php - mysql_affected_rows 不显示消息

php - 默认内容放在哪里?代码还是数据库?

mysql - 仅当所有 ID 均适用时才从 ManyToMany 中选择