2014-02-14 3 views
1

У меня есть две текущие таблицы. Я хочу получить все соответствующие строки порядка в ОДНОМ запросе.MySQL GROUP BY: Как вернуть несколько строк?

enter image description here

Мой текущий код выглядит следующим образом:

$query = ' 
SELECT * FROM table_a 
JOIN table_b ON table_b.order_id = table_a.order_id 
WHERE table_a.order_id = '1' 
GROUP BY table_a.order_id 
'; 

$result_prepare = $this->DB->prepare($query); 
$result_prepare->execute(); 

$result = $result_prepare->fetchAll(PDO::FETCH_ASSOC); 
$query_result = array('result'=>$result); 

print_r($query_result); 

Выходной Возвращаемый результат только первая строка:

Array 
(
    [0] => Array 
     (
      [order_id] => 1 
      [row_id] => 1 
      [value] => 100 
     ) 

} 

Я хотел бы результат вывода, чтобы вернуть все строки сгруппированных по строкам.

Array 
(
    [0] => Array 
     (
      [order_id] => 1 
      [rows] => Array 
        (
         [0] => Array 
          (
           [row_id] => 1 
           [value] => 100 

          ) 

         [1] => Array 
          (
           [row_id] => 2 
           [value] => 101 

          ) 

        ) 

     ) 

} 

Как я могу это достичь? Мне нужно изменить свой SQL-запрос.

+1

вы не можете иметь такой выход в sql. у вас всегда будут строки с одинаковым количеством столбцов в каждой строке. столбец не может иметь в нем несколько значений. –

+0

@VolkanUlukut Правильно - SQL-запрос вернет 3 столбца для каждой строки, и ваша логика отображения PHP отвечает только за печать 'order_id', когда она изменяется. Сам SQL так же прост, как 'SELECT order_id, row_id, значение FROM TableB ORDER BY order_id, row_id' –

+0

Обратите внимание, что SQL работает на логике реляционных множеств, а не на процедуре/массиве. Попробуйте записать результат, который вы хотите получить в форме набора результатов. Ваш вопрос путается, и я не могу понять, что вы хотите (агрегат, отдельный, join ,?) – jean

ответ

2

Ваша единственная строка является результатом обработки MySQL GROUP BY без каких-либо агрегатных функций, таких как COUNT(),SUM(),MIN(),MAX(). Он сворачивает группу в одну строку с неопределенными значениями для негрупповых столбцов и не на что можно положиться.

Вам не нужен GROUP BY, хотя вам нужна структура массива, которая индексируется order_id. Вместо этого выполните простой запрос, а затем в своем PHP-коде, перестройте его в цикле в нужном вам формате.

// join in table_a if you need more columns.. 
// but this query is doable with table_b alone 
$query = " 
SELECT 
order_id, 
row_id, 
value 
FROM table_b 
WHERE order_id = '1' 
"; 

// You do not actually need to prepare/execute this unless you 
// are eventually going to pass order_id as a parameter 
// You could just use `$this->DB->query($query) for the 
// simple query without user input 
$result_prepare = $this->DB->prepare($query); 
$result_prepare->execute(); 

$result = $result_prepare->fetchAll(PDO::FETCH_ASSOC); 

// $result now is an array with order_id, row_id, value 
// Loop over it to build the array you want 
$final_output = array(); 
foreach ($result as $row) { 
    $order_id = $row['order_id']; 

    // Init sub-array for order_id if not already initialized 
    if (!isset($final_output[$order_id])) { 
    $final_output[$order_id] = array(); 
    } 
    // Append the row to the sub-array 
    $final_output[$order_id][] = array(
    'row_id' => $row['row_id'], 
    'value' => $row['value'] 
); 
    // You could just append [] = $row, but you would still 
    // have the order_id in the sub-array then. You could just 
    // ignore it. That simplifies to: 
    // $final_output[$order_id][] = $row; 
} 

// Format a little different than your output, order_id as array keys 
// without a string key called order_id 
print_r($final_output); 
+0

Спасибо, Майкл! –

0

Я думаю, что вы хотите:

$query = ' 
SELECT * 
FROM table_a 
JOIN table_b 
ON table_b.order_id = table_a.order_id 
WHERE table_a.order_id = '1' 
ORDER BY b.row_id 
'; 
0

Я думаю, вам нужно использовать OUTER JOIN Постулаты, не GROUP BY.

Смежные вопросы