0

在我的小型应用程序中,我的事件可以与多个图像相关联。

例如,事件“单板滑雪”可能具有与其相关联的三个图像。

这是我的表:

Events
   event_id  title

Event_Images
   event_image_id   image_src   time_uploaded

这是我目前正在使用的查询:

SELECT * FROM Events, Event_Images 
   WHERE Events.event_id = Event_Images.event_id 

结果如下:

[
    {
        "event_id": "67",
        "title": "Setting up the UGS App!",
        "event_image_id": "64",
        "image_src": "uploads/50f47bce35d4f.jpg",
        "time_uploaded": "2013-01-14 16:42:41"
    },
    {
        "event_id": "67",
        "title": "Setting up the UGS App!",
        "event_image_id": "92",
        "image_src": "uploads/49f4709eppdl.jpg",
        "time_uploaded": "2013-02-14 12:44:43"
    }
]

但是,这对我来说似乎是多余的。我认为冗余最少的数据结构如下所示:

[
    {
        "event_id": "67",
        "title": "Setting up the UGS App!",
        "event_image_id": "64",
        "images": [
            {
                "image_src": "uploads/50f47bce35d4f.jpg",
                "time_uploaded": "2013-01-14 16:42:41"
            },
            {
                "image_src": "uploads/49f4709eppdl.jpg",
                "time_uploaded": "2013-02-14 12:44:43"
            }
        ]
    }
]

我想要么我目前的做法是正确的,要么有一种方法可以减少我的查询的冗余结果。

如果这似乎是一个简单的问题,请原谅我的无知。

非常感谢任何参考或帮助。

4

2 回答 2

0

SQL 返回匹配的行。它不会从 RBMS 返回数据层次结构。您将需要两个查询来实现您想要的数据结构——一个选择事件,然后一个选择事件图像。然后将事件图像附加到事件对象中的“图像”数组中。

于 2013-01-27T23:54:19.817 回答
0

好的,多亏了 inhan,我有了答案——在数据返回后使用 php 格式化数据。有了这些信息,我就写了一个可重用的函数:

function merge_data($data, $merge_key, $merge_prop, $merge_data) {
    /* build an array of the merge data arranged by the merge key */
    $associated_data_keys = array();
    foreach($data as $value) {
        $grouped_merge_data = array(); // group together the merge data
        foreach($merge_data as $merge_value) {
            $grouped_merge_data[$merge_value] = $value[$merge_value];
        }
        if (empty($associated_data_keys[$value[$merge_key]])) {
            $associated_data_keys[$value[$merge_key]] = array();
        }
        array_push($associated_data_keys[$value[$merge_key]], $grouped_merge_data);
    }

    /* remove duplicate data values */
    $existing_keys = array();
    foreach($data as $key => $value) {
        if (!in_array($value[$merge_key], $existing_keys)) {
            array_push($existing_keys, $value[$merge_key]);
        } else {
            unset($data[$key]);
        }
    }

    /* remove merge data properties */
    foreach($merge_data as $value) {
        foreach($data as $key => $data_value) {
            unset($data[$key][$value]);
        }
    }

    /* put our data from the first statement back into our data set */
    foreach($data as $key => $value) {
        /* assign our data set at this value at the merge property to the corresponding merged data */
        $data[$key][$merge_prop] = $associated_data_keys[$value[$merge_key]];
    }

    return $data;
}

在这种情况下使用:

$events = merge_data($events, 'event_id', 'images', array('event_image_id', 'image_src', 'time_uploaded'));
于 2013-01-28T01:22:56.367 回答