2017-10-30 18 views
0

여러 테이블에서 여러 행을 검색하려고하는데 올바른 방법으로 수행하지 않을 것이라고 생각합니다. 프로젝트는 온라인 쇼핑몰입니다. 주문, 주문 정보 및 서비스는 모두 ID와 연결되어 있습니다.여러 테이블에서 여러 행 검색

주문 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 
) 

나는 두 가지 문제가있다. 첫 번째 문제는 주문 테이블과 서비스 테이블에 동일한 열 이름이 있다는 것입니다. 제 2 회는 (내가 아니라 쿼리하고 있지 않다 알고 있기 때문에) 쿼리가 모든 정보를 반환하지만, 나는이 같은 받으실 :

내 말은
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; 
+0

쿼리가 원하는 결과를 더 많이 또는 적게 반환해야하므로 SQL에서는 문제가되지 않지만 PHP에서는 문제가되지 않습니다. 쿼리 결과에서 어떻게 그 객체를 얻습니까? 사용하는 코드가 중복 된 열 이름을 버리거나 병합하는 것 같습니다. –

+0

나는 이것을 사용한다 :'$ array = array(); \t \t \t 동안 ($ 루프 = $에서 그 결과> fetch_object()) { \t \t \t \t $ 배열 [] = $ 루프; \t \t \t} \t \t \t 반환 $ 배열, 나는 전적으로 당신의 대답에 동의' – kh0d3x

답변

0

문제는 당신 때문에 당신이 결과를 얻기를 위해 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_id은 기본 키의 경우 orderswhere 조건에서 customer_id을 사용할 필요가 없으며 기본 키가 두 열로 구성된 경우 (즉, 다른 고객에 대해 동일한 주문 ID를 가질 수 있음) 변경하고 order_id 만 사용하는 것이 좋습니다.

+0

.그게 첫 번째 문제를 해결하고, 두 번째 문제는 어떨까요? 내 말은, 나는 올바른 방향 일지 모르지만 나는 확실하지 않다. 고객이 3 개 품목을 구입 한 경우 주문 상세 정보 테이블에 3 개의 행이 있음을 의미합니다. 고객이 구입 한 3 가지 항목이 하나의 객체를 수신 할 수있는 방법이 있습니까? 어쩌면 group_concat? 이것은 미적 문제에만 해당됩니다. 이 주제와 비슷한 것 : https://stackoverflow.com/questions/13451605/how-to-use-group-concat-in-a-concat-in-mysql – kh0d3x

+0

죄송합니다. 두 번째 질문에 대해서는 눈치 채지 못했습니다. 그것에 관해서는, 같은 오브젝트에서 3 개의 결과를 병합하는 것이 가능할 수 있지만, 좋은 개념은 아닙니다. 단지 하나의 오브젝트만으로 동일한 개념에 대해 다른 이름을 가지기 때문에, 오브젝트의 배열을 갖는 것이 좋습니다. (연상 배열 대신 객체에 결과를 넣을 목적을 없애는) 동적 코드를 사용해야합니다. 엄지 손가락의 규칙으로 'name1, name2, name3 ...'과 같은 항목이 무제한 인 경우 데이터를 리팩토링해야합니다. –

+0

그래서 지금 가지고있는 것과 같은 물건을 사용 하시길 권장합니까? 여기에 내가 "어쩌면 나는 올바른 방향으로 가고 있지만 확실하지 않다"고 말한 것입니다. orderdetails의 테이블 (고객이 구입 한 항목이있는)의 모든 루프에서 고객 이름과 성을 검색하는 것이 좋은 방법인지는 확실하지 않습니다. 어쩌면 중복되지만 주문을 얻기 위해 하나의 쿼리를 만들고 싶지 않으며 고객 데이터를 얻기 위해 세 번째 쿼리를 만들고 싶지 않습니다. 좋지 않다고 생각합니다. 고마워, 너의 추천을 사용할거야. – kh0d3x