Как мне объединить данные двух таблиц и расширить их строку как массив?

1

Я хочу объединить данные двух таблиц и вернуть их как json, но я не могу понять, что это правильно. Я пробовал оба с INNER/LEFT Join и с вложенными запросами, но оба без действительного результата.

Вот как структурируются мои таблицы:

Мероприятия:

----------------------------------
id |  title   | extra1 | extra2
----------------------------------
 1 | EventNo1 |  ...   |  ...
 2 | EventNo2 |  ...   |  ...
 3 | EventNo3 |  ...   |  ...
 4 | EventNo4 |  ...   |  ...
 5 | EventNo5 |  ...   |  ...

изображений:

----------------------------------
id | event | val | height | width
----------------------------------
 2 |   5   | xxx |  xxx   |  xxx
 3 |   2   | xxy |  xxx   |  xxx
 6 |   5   | xyx |  xxx   |  xxx

Поэтому в основном я хочу получить данные из events и для каждого события, где images.event соответствует events.id Я хочу расширить данные из images.

Это результат json, которого я хотел бы достичь:

[
  {
    "id": "1",
    "title": "EventNo1",
    "extra1": "...",
    "extra2": "...",
    "images": []
  },
  {
    "id": "2",
    "title": "EventNo2",
    "extra1": "...",
    "extra2": "...",
    "images": [
      {
        "id": 3,
        "val": "xxy",
        "height": "xxx",
        "width": "xxx"
      }
    ]
  },
  {
    "id": "3",
    "title": "EventNo3",
    "extra1": "...",
    "extra2": "...",
    "images": []
  },
  {
    "id": "4",
    "title": "EventNo4",
    "images": []
  },
  {
    "id": "5",
    "title": "EventNo5",
    "extra1": "...",
    "extra2": "...",
    "images": [
      {
        "id": 2,
        "val": "xxx",
        "height": "xxx",
        "width": "xxx"
      },
      {
        "id": 6,
        "val": "xyx",
        "height": "xxx",
        "width": "xxx"
      }
    ]
  }
]

Как это сделать в php + mysqli?

  • 0
    Именно так. Что ты уже испробовал ?
  • 0
    Я принял "гаурав рай". Я попробовал его подход раньше, но там, где мои объекты были отделены. Не думал просто расширять их, что заставило меня вместо этого рассмотреть ВНУТРЕННИЕ / ЛЕВЫЕ соединения
Теги:
arrays
mysqli
inner-join
left-join

2 ответа

1
Лучший ответ
$q = "select * from events";
$res = mysql_query($q);
while($row = mysql_fetch_assoc($res)){
 $image_data= array();
 $q2 = "select * from images where event = ".$row['id'];
 $res2 = mysql_query($q2);
 while($row2 = mysql_fetch_assoc($res2)){
 $image_data[] = $row2;
 }
 $row['images'] = $image_data;
 $event_data[] = $row;
}
echo json_encode($event_data);
  • 0
    Блин, я был ближе, чем думал. Я уже попробовал ваш подход, но где у меня были "изображения" в отдельном объекте. Не думал просто расширить его с помощью "$ row ['images'] = $ image_data;" Большое спасибо! :)
  • 0
    пожалуйста... :).
1

Псевдокод, поскольку я не знаю, какую библиотеку/оболочку вы используете для доступа к своей базе данных:

$query = "select * from events";
$rows = $db->query($query);

foreach($rows as $k => $row) {
  $query = "select * from images where event = ".$row['id'];
  $rows[$k]['images'] = $db->query($query);
}

echo json_encode($rows);

Предполагается, что $db->query() возвращает набор результатов в виде массива, включая пустую, если строки не найдены.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню