0

オーディオクリップ、写真、ビデオなどのさまざまなメディアをアップロードしてオンラインストーリーを作成できるWebサイトにリレーショナルMySQLデータベースを使用しています。このサイトには、ユーザーが作成、表示、編集できるパーソナルスペースへのログイン機能があります。ストーリー。この質問では、データベースに4つのテーブルがあるとします。メモリボックス(ストーリーに関するメタ情報、つまりタイトル、日付、説明)、オーディオ、写真、ビデオ(後者の3つでは、すべてのメディアがメモリボックス内の1つのストーリーに接続されています)表-個々のメディアファイルは、メモリボックスIDの列によってストーリーにリンクされます)。

PHPを使用して、ストーリーに関連付けられているすべてのメディアとストーリーのメタデータを選択し、XMLファイルにエクスポートしています。XMLから、jqueryを使用して、最初にストーリー(ストーリーのタイトルが付いたある種のアイコン)を表示し、次にストーリーアイコンをクリックすると、すべてのメディアをストーリービューに表示します。

私が欲しいのは、すべてのメディアファイルを1つのストーリー(およびそのメタデータ)だけに関連付けることです。私の問題は、必要なXML結果を完全に取得できず、問題がクエリにあるのかデータベース構造にあるのかわからないことです。IDSが一致するすべての場所を選択しようとしましたが、メディアファイルごとに個別のエントリの長いリストが表示されます。また、LEFT JOINを使用して、すべてをメモリボックスIDに関連付けようとしましたが、1つのIDに対して複数のエントリを取得します。GROUP BYを試しましたが、メディアデータが1行しか表示されませんでした。

これを実行できるクエリはありますか、それともデータベース構造を再考する必要がありますか?

ありがとう、シェリル

4

1 に答える 1

1

あなたの質問から判断すると、あなたはまだリレーショナルデータベースに頭を悩ませていません。手続き型コードとオブジェクト指向プログラミングの違いを理解していますか?RealtionalDBに移行することは、規模が似ているステップです。

そのセットにレコードが1つしかない場合でも、常にデータセットを考えてください。テーブルはデータセット、クエリ結果は別、ビューは1つ、結合は2つを組み合わせたものです。

あなたの質問について: ストーリーは、メモリボックステーブルの1つのレコードと、任意のメディアテーブルの1つ以上のレコードで構成されていることを理解しています。

このため、テーブル構造はほとんど問題ありません。私は 想像 table memoryboxes(id int, metadata varchar)し ますtable fotos(memorybox_id int, thefoto clob)、、、 。table audios(memorybox_id int, theaudio club)table videos(memorybox_id int, thevideo clob)

「完全なストーリー」を取得するには、memorybox_idに基づいてこれらすべてのテーブルから選択するのが最適です。つまり、4つのクエリが(1つのトランザクションで)次々に実行されます。それらの結果セットからxmlをビルドします。

結合の場合:( 左)結合は、説明したとおりに動作する必要があります。前提に基づいてデータセットを結合します(この場合、IDは同じです)。左結合を使用すると、「右側」のデータセットに一致するレコードがない場合でも、「左側」のデータセットにレコードを作成できます。考えてみてください。これにより、述語に一致するデータセットのすべての順列が得られます。まさにあなたが説明すること。

group- byの場合:group by(by id)はデータセットを「ロールアップ」します。お気づきのとおり、group-by句またはでそのgroup-byクエリの列が必要でした。いわゆる集計関数(count、min、max、...)は、結果のグループ化(テーブルの複合キーを考えてください)に参加したか、最終的な値が基になるデータセットグループのすべてのデータで構成されることを意味します。

簡単に言うと、データベース構造は問題ありません。データを取得するには、(トランザクションで)4つの個別のクエリを使用します。

次のステップ: たとえば、ストーリー内の関連メディアの量をリストするクエリを作成する場合は、結合とグループ化についてもう少し読んでみてください。

select 
    m.metadata, 
    count(f.id) as fotocount, 
    count(a.id) as audiocount, 
    count(v.id) as videocount 
from 
    memoryboxes m 
    left join fotos f on f.memorybox_id=m.id
    left join audios a on a.memorybox_id=m.id
    left join videos v on v.memorybox_id=m.id
group by m.metadata
于 2012-07-31T16:12:04.130 に答える