php mysql select, результат массива внутри результата массива - PullRequest
2 голосов
/ 08 февраля 2012

у меня 3 стола,

 tbl_photo               tbl_photo_comments      tbl_photo_likers
 ___________             ____________             _____________
| photo_id  |           | comment_id |           | like_id     |
| photo_url |           | photo_id FK|           | user_id FK  |
| user_id FK|           | user_id FK |           | photo_id FK |
                        | comment    | 

Моя цель состоит в том, чтобы получить данные фотографий из tbl_photo вместе с их соответствующими данными комментариев и данными пользователей. Структура массива, который я хочу, как показано ниже, где у меня есть ОДИН массив результатов, который имеет еще 2 массива в качестве элементов на своих данных

oneResultArray =
{
  photo_url = "www.url.com/photo.png";
  photoID = 1;
  user_id =  2
  commentData = (
     {
         comment = "comment 1";
         userid = 1
     },
     {
         comment = "comment 2";
         userid = 2
     },
     {
         comment = "comment 3";
         userid = 3});

     likersData = (
     {
         userid = 2;
         username = liker1;
     },
     {
         userid = 3;
         username = liker2;
     });

   },
{
  photo_url = "www.url.com/photo.png";
  photoID = 1;
  user_id =  2
  commentData = (
     {
         comment = "comment 1";
         userid = 1
     },
     {
         comment = "comment 2";
         userid = 2
     },
     {
         comment = "comment 3";
         userid = 3});

     likersData = (
     {
         userid = 2;
         username = liker1;
     },
     {
         userid = 3;
         username = liker2;
     });
   }

мой вопрос: возможно ли сделать это с помощью одного запроса на MySQL? если нет, есть ли другой способ сделать это? спасибо, ребята!

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

Как указывал Давидтелл, вы не хотите присоединяться к этим столам. Таким образом, невозможно выбрать ваши данные в одном запросе. Подход Garry Welding может быть интерпретирован для запуска последующих запросов для каждой полученной вами фотографии. Это НЕ , что вы хотите сделать либо. 3 фотографии приведут к выполнению 7 запросов. Это на 4 больше, чем нужно. 10 фотографий приведут к 21 запросу. Вы получаете картину. Попробуйте что-то вроде:

<?php

// build hierarchical result
$result = array();

// getting the photos
$query = $pdo->query('SELECT photo_id, photo_url, user_id FROM tbl_photo WHERE user_id = 5');
foreach ($query as $row) {
    $result[$row['photo_id']] = $row;
    $result[$row['photo_id']]['comments'] = array();
    $result[$row['photo_id']]['likes'] = array();
}

if ($result) {
    // comments and likes only for the photos we've selected
    $photos = join(',', array_keys($result));

    // getting the comments
    $query = $pdo->query('SELECT comment_id, photo_id, user_id, comment FROM tbl_photo_comments WHERE photo_id IN (' . $photos . ')');
    foreach ($query as $row) {
        $result[$row['photo_id']]['comments'][$row['comment_id']] = $row;
    }

    // getting the likes
    $query = $pdo->query('SELECT like_id, user_id, photo_id FROM tbl_photo_likers WHERE photo_id IN (' . $photos . ')');
    foreach ($query as $row) {
        $result[$row['photo_id']]['likes'][$row['like_id']] = $row;
    }
}

var_dump($result);
1 голос
/ 08 февраля 2012

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

0 голосов
/ 08 февраля 2012
$photos = {code to get the array of photos};

foreach($photos as &$photo) {
    $photo['comments'] = {code to get photo comments using the photo id};
    $photo['likes'] = {code to get photo likes using the photo id}
}

return $photos;

Это был бы единственный способ сделать это.& Before $ photo - передать массив по ссылке.Передача массивов по ссылке доступна только в PHP5 +, http://php.net/manual/en/language.types.array.php.

По ссылке выше на PHP.net:

// PHP 5
foreach ($colors as &$color) {
    $color = strtoupper($color);
}
unset($color); /* ensure that following writes to
$color will not modify the last array element */

// Workaround for older versions
foreach ($colors as $key => $color) {
    $colors[$key] = strtoupper($color);
}

print_r($colors);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...