2016-03-19 3 views
0

Сценария:Как отобразить совпадающие записи вернулись из объединения вместо отдельных строк

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

Таблица 1: изображения

+--------+------------+ 
| img_id | img_name | 
+--------+------------+ 
|  1 | image1.jpg | 
|  2 | image2.jpg | 
|  3 | image3.jpg | 
+--------+------------+ 

Таблица 2: image_tags

+---------+--------+----------+--------+--------+ 
| cord_id | img_id | tag_text | xcord | ycord | 
+---------+--------+----------+--------+--------+ 
| 1  | 1  | Tag1  | 28.1 | 30.4 | 
| 2  | 1  | Test Tag | 23.4 | 4.5 | 
+---------+--------+----------+--------+--------+ 

Теперь я хочу, чтобы изображения вместе со своими тегами, которые довольно просто с помощью левой присоединиться

SELECT img_id, img_name,tag_text, xcord,ycord FROM images t1 LEFT JOIN image_tags t2 ON t1.id=t2.id 

Это результаты запроса в следующих наборов данных

+--------+------------+----------+--------+--------+ 
| img_id | img_name | tag_text | xcord | ycord | 
+--------+------------+----------+--------+--------+ 
| 1  | image1.jpg | Tag1  | 28.1 | 30.4 | 
| 1  | image1.jpg | Test Tag | 23.4 | 4.5 | 
| 2  | image2.jpg | NULL  | NULL | NULL | 
| 3  | image3.jpg | NULL  | NULL | NULL | 
+--------+------------+----------+--------+--------+ 

Проблема:

Теперь с помощью PHP (или MYSQL, если это возможно), я хочу, чтобы результаты от image_tags таблиц, которые будут сцеплены с каждой строкой в виде массива. Итак, когда я прокручиваю записи в Angular, у меня есть изображения вместе с их тегами в виде массива вместо двух отдельных строк, так как вы можете видеть первые две строки в наборе результатов.

Желаемый результат пример,

{ 
    cord_id : 1, 
    img_id : 1, 
    tags : [{ 
     tag_text : "Tag1", 
     xcord : 28.1, 
     ycord : 30.4, 
    },{ 
     tag_text : "Test Tag", 
     xcord : 23.4, 
     ycord : 4.5, 
    } 
    ] 
} 

Я изучал о карту() функция в PHP, но не смог этого добиться.

Примечание: Я использую CodeIgniter, так что если какая-то соответствующая поддержка для достижения этой цели, что также будет работать для меня.

Любая помощь будет высоко оценена. Спасибо

+1

ли вы попробовать с [GROUP_CONCAT] (http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat)? –

+0

Да, я сделал, но не смог достигнуть упомянутого желаемого результата –

+0

@YousalfHassan: Как насчет ожидания столбцов xcord, ycord? Можете ли вы записать свое ожидание в один стол, как вы это делали с другими? С помощью PHP легко создать JSON в качестве желаемого результата из вашего результата запроса. –

ответ

0

Это можно сделать только одним запросом.

Поскольку у вас есть уникальный идентификатор, вы можете использовать его в качестве индекса для своего массива.

$images = array(); 
foreach($queryResults as $result){ 
    if(!isset($images[$result['img_id']])){ 
    $images[$result['img_id']] = array(); 
    $images[$result['img_id']]['cord_id'] = $result['cord_id']; 
    $images[$result['img_id']]['img_id'] = $result['img_id']; 
    $images[$result['img_id']]['tags'] = array(); 
    } 
    $tag = array(
      'tag_text'=>$result['tag_text'], 
      'xcord'=> $result['xcord'], 
      'ycord'=> $result['ycord'] 
     ); 
    $images[$result['img_id']]['tags'][] = $tag; 
} 
Смежные вопросы