2013-02-24 2 views
0

Возможно ли получить результат, как это от 2-х таблиц products и products image отношения таблицы ...получения объединенного результата в SQL

я использую PHP. Я могу обрабатывать данные с помощью php, но я хочу получить данные в этой форме с помощью sql из-за производительности. Я знаю, как sql join, но он дает простые данные массива. Мне нужны данные как массив в массиве.

Products стол:

id name  
1 product1   
2 product2 

images стол:

product_id imageid 
1   1 
1   2 
1   3 
2   4 
2   5 
2   6 


[0] => Array 
     (
      [id] => 1 
      [images] => Array 
       (
        [0] => 1 
        [1] => 2 
        [2] => 3 
       ) 

     ) 
[1] => Array 
     (
      [id] => 2 
      [images] => Array 
       (
        [0] => 4 
        [1] => 5 
        [2] => 6 
       ) 
     ) 
+0

Да. используйте sql join: http://en.wikipedia.org/wiki/Join_%28SQL%29 –

+0

Я знаю, что sql join, но он не дает массив результатов в массиве. Он дает просто простой массив с отношением –

+0

, это не БД неисправность. это ваша ошибка в том, что вы неправильно структурируете свой код «выборки». –

ответ

0

Нет, это не возможно, чтобы получить массив в массиве в результате непосредственно из реляционных (SQL) базы данных.

Вам нужно будет перебрать результаты и создать массив самостоятельно, например.

$productsById = array(); 

foreach ($dbRows as $row) { 
    if (!isset($productsById[$row['product_id']])) { 
     $product = array(
      'id' => $row['product_id'], 
      'name' => $row['product_name'] 
     ); 
     //note the use of the & to set the $product array by reference 
     $productsById[$row['product_id']] = &$product; 
    } 
    //note the use of the & to retrieve the $product array by reference 
    else $product = &$productsById[$row['product_id']]; 

    $product['images'][] = array(
     'id' => $row['image_id'] 
    ); 

    //We unset this because we accessed it by reference above; this prevents referencing the wrong product 
    //on the next iteration of the loop. 
    unset($product); 
} 

Или, чтобы получить массив объектов:

$productsById = array(); 

foreach ($dbRows as $row) { 
    if (!isset($productsById[$row['product_id']])) { 
     $product = new stdClass; 
     $product->id = $row['product_id']; 
     $product->name = $row['product_name']; 
     $product->images = array(); 
     $productsById[$row['product_id']] = $product; 
    } 
    else $product = $productsById[$row['product_id']]; 

    $image = new stdClass; 
    $image->id = $row['image_id']; 
    $product->images[] = $image; 
} 

Стоит также отметить, однако, что если вы используете MySQL (и портативность база данных не является проблемой), вы можете использовать функции GROUP_CONCAT, например:

SELECT p.id as product_id, p.name as product_name, GROUP_CONCAT(i.id) as image_ids 
FROM product p 
LEFT JOIN image i ON p.id = i.product_id 
GROUP BY p.id 

Затем в PHP, нужно иметь только один $ массив строк для каждого продукта, и вы могли бы получить идентификаторы изображений просто с помощью:

$imageIds = explode(',', $row['image_ids']); 
+0

Большое спасибо .. –

+0

В моем первом примере выше была ошибка; Теперь я исправил это. –

+0

Это, конечно, предполагает, что каждый продукт имеет изображения; если нет, вам нужно проверить 'empty ($ row ['image_id'])', чтобы проверить, есть ли идентификатор изображения или нет, прежде чем добавлять его в массив изображений. –

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