2013-05-31 2 views
1

У меня есть 2 таблицы. Первая содержит некоторую глобальную информацию, а вторая содержит список изображений.MySQL: Присоединитесь к таблице с несколькими строками данных

Когда я выполняю эту просьбу:

SELECT table1.title, table1.description, table2.image LEFT JOIN table2 ON table2.table1_id = table1.table1_id 

Таблицы Структура:

TABLE1

| table1_id | title | description | 
| 1 | title1 | description1 | 
| 2 | title2 | description2 | 
| 3 | title3 | description3 | 

TABLE2

| id | table1_id | image | 
| 1 | 1 | img/img1.png | 
| 2 | 1 | img/img2.png | 
| 3 | 1 | img/img3.png | 
| 4 | 2 | img/img4.png | 
| 5 | 2 | img/img5.png | 
| 6 | 3 | img/img6.png | 

я получил что-то вроде этого:

<?php 
array(
    array('title' => 'title1', 'description' => 'description1', 'image' => 'img/img1.png'), 
    array('title' => 'title1', 'description' => 'description1', 'image' => 'img/img2.png'), 
    array('title' => 'title1', 'description' => 'description1', 'image' => 'img/img3.png'), 
    array('title' => 'title2', 'description' => 'description2', 'image' => 'img/img4.png'), 
    array('title' => 'title2', 'description' => 'description2', 'image' => 'img/img5.png'), 
    array('title' => 'title3', 'description' => 'description3', 'image' => 'img/img6.png') 
); 
?> 

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

<?php 
array(
    array('title' => 'title1', 'description' => 'description1', 'image' => 
     array('img/img1.png', 'img/img2.png', 'img/img3.png') 
    ), 
    array('title' => 'title2', 'description' => 'description2', 'image' => 
     array('img/img1.png', 'img/img2.png') 
    ), 
    array('title' => 'title3', 'description' => 'description3', 'image' => 
     array('img/img6.png') 
    ) 
); 
?> 

Мои вопросы:

  • Можно ли получить такую ​​структуру данных только с помощью запроса SQL (Нет PHP манипуляции. .)

  • Если нет, то какие манипуляции с PHP я должен сделать, чтобы преобразовать свой первый массив в мой второй массив?

Спасибо!

+0

Этот вопрос немного запутан. Возможно, если вы включите связанные структуры таблиц базы данных, которые помогут мне [и, возможно, другим] понять, что является основной проблемой. –

+0

Я добавил структуры таблицы – alexmngn

ответ

2

Посмотрите на group пункта и group_concat функции. Я не уверен, создает ли массив в PHP, но это почти то, что вы хотите:

SELECT table1.title, table1.description, GROUP_CONCAT(table2.image) LEFT JOIN table2 ON table2.id = table1.id GROUP BY table1.id 

Вы можете использовать explode функцию в PHP для преобразования результата из GROUP_CONCAT(table2.image) в PHP массив

Смотрите документацию от MySQL's group_concat и PHP's explode функций.

+0

@tilix - это как можно ближе к тому, что вы хотите. Ваш вывод PHP будет выглядеть так для каждого заголовка: 'array ('title' => 'title1', 'description' => 'description1', 'image' => 'img/img1.png, img/img2.png, IMG/img3.png ') '. Вы можете «взорвать» элемент «image», чтобы получить отдельные имена файлов. –

+0

@EdGibbs - Я обновляю свой ответ несколько секунд назад. Спасибо за комментарий в любом случае :-) –

0

Вы можете сделать выбор во всех отдельных (Name, Description) кортежах. Тогда у вас будет массив имен, описаний и нулевой третий элемент. Затем пропустите этот массив и получите все изображения для этого отдельного кортежа. Затем возьмите этот результат и вставьте его в третий элемент.

запроса получить массив имен/описания:

select distinct table1.title, table2.description left join table2 on table2.id = table1.id 

запрос, чтобы найти все образы различных название/описание кортежей:

select table2.image inner join table1 on table1.id = table2.id where table1.name = arr[0] and table1.description = arr[1] 
0

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

<?php 
$items = array(); 
foreach ($rows as $row) { 
    if (! isset($items[ $row['title'] ])) { 
     $items[ $row['title'] ] = array(
      'title'   => $row['title'], 
      'description' => $row['description'], 
      'images'  => array($row['image']), 
     ); 
     continue; 
    } 
    $items[ $row['title'] ]['images'][] = $row['image']; 
} 
$items = array_values($items); 

Anthony.

0
PHP code: 

<?php 
/*here is your result array*/ 
$result = array(
    array('title' => 'tile1', 'description' => 'description1', 'image' => 'img/img1.png'), 
    array('title' => 'tile1', 'description' => 'description1', 'image' => 'img/img2.png'), 
    array('title' => 'tile1', 'description' => 'description1', 'image' => 'img/img3.png'), 
    array('title' => 'tile2', 'description' => 'description2', 'image' => 'img/img4.png'), 
    array('title' => 'tile2', 'description' => 'description2', 'image' => 'img/img5.png'), 
    array('title' => 'tile3', 'description' => 'description3', 'image' => 'img/img6.png') 
); 

/*creating a new formatted array*/ 
$newResult = array(); 
foreach($result as $value){ 
    $newResult[$value['title']]['title'] = $value['title']; 
    $newResult[$value['title']]['description'] = $value['description']; 
    $newResult[$value['title']]['image'][] = $value['image']; 
} 

/*printing new final formatted array*/ 
print_r($newResult)); 
?> 
Смежные вопросы