2013-08-21 2 views
0

을 MySQL로 어떻게 그 두 테이블GROUP_CONCAT

id_of_orders

id_order| time    | username | price 
35  |2013-08-11 15:03:01|   |0.00 
36  |2013-08-21 12:43:31|skata  |0.00 
37  |2013-08-21 12:43:55|skata  |12.00 

주문이

order_id | product | ulika 
35  |frento |zaxari,fountoukia,troufa 
35  |frento |zaxari,kakao 
35  |frento | 
36  |frapes |zaxari 
37  |frento | 
35  |frapes | 

내가 사용 를 포함하는 모든 레코드의 데이터를 반환하는 특정 제품에 대해 원하는 GROUP_CONCAT하지만 제품의 모든 값을 반환하지는 않습니다.

if(!empty($_SESSION['proions'])){ 
    $query= "SELECT i.id_order, i.time, i.username, i.price, GROUP_CONCAT(o.product) as PRO 
    FROM id_of_orders i INNER JOIN orders o 
    ON i.id_order = o.order_id 
    WHERE o.product = '$_SESSION[proions]'"; 
    $query .=" GROUP BY i.id_order" ; 
    $result = mysql_query($query); 
} 

예를 들어 '프렌치'가 들어있는 레코드의 데이터를 수집하려고하면 결과가 나타납니다. 나는 제품 'frapes'을 놓친다.

35: -> 2013-08-11 15:03:01 0.00 frento,frento,frento 
37: -> 2013-08-21 12:43:55 skata 12.00 frento 
+0

당신이 여기 필요하지 않습니다 group_concat 당신이 원하는 것 같아요 다음과 같은 쿼리를 사용할 수 있습니다 : SELECT * FROM orders, id_of_orders where orders.id_order = id_of_orders.order_id and id_of_orders.order_id in (select order_id FROM orders where product = '프렌 츠'); 죄송 \t orders.id_order = id_of_orders.order_id \t 및 orders.product을 id_of_orders, 당신은) (내가이 일을 시도 – talsibony

+0

을에서 사용할 수 있지만 "= 모든 \t $ 쿼리에서 일 주문 SELECT * FROM하지 않는 것 같다 = '$ _SESSION [proions]' " –

+0

* inner * join이 아닌 * outer *를 사용해야합니다. [SQL 결합의 시각적 설명] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html)을 참조하십시오. – eggyal

답변

1

쿼리는 제품의 모든 행을 필터링합니다. 당신은 having 절에 그 비교를 이동해야합니다

SELECT i.id_order, i.time, i.username, i.price, GROUP_CONCAT(o.product) as PRO 
FROM id_of_orders i INNER JOIN 
    orders o 
    ON i.id_order = o.order_id 
GROUP BY i.id_order 
HAVING max(o.product = '$_SESSION[proions]'") > 0; 

이은 행 중 적어도 하나는 당신이 원하는 제품을 일치하는 주문에 대한 모든 제품을 반환합니다.