0

私の小さなアプリケーションには、複数の画像を関連付けることができるイベントがあります。

たとえば、イベント「スノーボード」には 3 つの画像が関連付けられている場合があります。

ここに私のテーブルがあります:

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

わかりました、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 に答える
0

SQL は一致する行を返します。RBMS からのデータの階層は返されません。目的のデータ構造を実現するには、2 つのクエリが必要です。1 つはイベントを選択するため、もう 1 つはイベントの画像を選択するためです。次に、イベント イメージをイベント オブジェクトの「images」配列に追加します。

于 2013-01-27T23:54:19.817 に答える