【发布时间】:2017-10-30 20:54:11
【问题描述】:
我正在尝试从多个表中检索多行,但我认为我没有以正确的方式进行操作。该项目有点像网上商店,我有 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 查询方面的专家,而且我阅读了很多,但我认为你们可以帮助我弄清楚这一点,因为我还有另外两个表要链接:客户服务工作者将得到处理的订单,以及接收订单的区域表。
我使用这段代码来获取对象:
$array = array();
while($loop = $result->fetch_object()){ $array[] = $loop; }
return $array;
【问题讨论】:
-
查询应该或多或少地返回你想要的,所以它似乎不是 SQL 的问题,而是 PHP 的问题。您如何从查询结果中获取该对象?您使用的代码似乎丢弃或合并重复的列名。
-
我用这个:
$array = array(); while($loop = $result->fetch_object()){ $array[] = $loop; } return $array;
标签: php mysql database-design inner-join multiple-columns