0

MySQLで何かを達成しようとしていますが、ここや他のサイトですべての答えを出しても、目標を達成することはできません。

1対多の関係にある2つのテーブルがあります。

TABLE Files
COLUMNS id, title, description, uploaded, size, extension, etc.

TABLE Files_Meta
COLUMNS id, parent_id, key, value

明らかに、各ファイルには、 Files_Metaテーブルの多くの行として表される複数のメタデータがあります。たとえば、File1には、メタAuthor、Place、Time、Tags、Cameraがあります(写真の場合)。

メタデータを含むファイルテーブルからすべての行を選択しようとしています。

標準結果

stdClass Object
(
[id] => 10
[title] => Hello world
[size] => 745198
[extension] => jpg
[user_id] => 0
[category_id] => 0
[date_uploaded] => 2012-06-08 13:37:55
[description] => 
[downloaded] => 0
[viewed] => 8
)

stdClass Object
(
[id] => 90
[parent_id] => 10
[key] => place
[value] => New York
)

欲しいもの

stdClass Object
(
[id] => 10
[title] => Hello world
[size] => 745198
[extension] => jpg
[user_id] => 0
[category_id] => 0
[date_uploaded] => 2012-06-08 13:37:55
[description] => 
[downloaded] => 0
[viewed] => 8
[meta] => Array (
    place => New York
    author => John Doe
    time => March 2001
    camera => Canon EOS
    etc.
    )
)

MySQLでこれを実現することは可能ですか?その配列がなければ、このように見える必要はありません。

stdClass Object
(
[id] => 10
.
.
[place] => New York
[author] => John Doe
[time] => March 2001
[camera] => Canon EOS
)

返信やヒントを事前に感謝します。

4

3 に答える 3

1

単一のクエリでこれを行うには、次のようになります。

SELECT * FROM Files INNER JOIN Files_Meta ON Files.id = Files_Meta.parent_id

コメントによると、MySQLはフラットな方法でのみ結果を返すため、必要な構造を作成するにはPHPが必要になります。

これを1つのクエリまたは2つのクエリ(1つはすべてに対してFiles、もう1つはすべてに対して)で行うようにコードを作成することを強くお勧めしますFiles_Meta。次に、データをPHPでつなぎ合わせます。そうしないと、N+1問題が発生する可能性があります。

余談ですが、に変更parent_idすることをお勧めしfile_idます。parent_id通常は自己参照キーを示します。一方、テーブルfile_idへの外部キーを示しFileます。

于 2012-06-20T15:39:58.167 に答える
0

PHPにもタグを付けたので、DoctrineやPropelのようなPHP ORMフレームワークを使用することをお勧めします。これにより、そのような構造が得られます(これは非常に抽象的なものです)。

class File {

/* members */

var id // int
var title // string
var description // string
var uploaded // boolean
var size // int
var extension // string
var metadata // array (Collection of FileMeta)

/* getters setters for each member */
...

}

class FileMeta {

var id // int
var fileId // the id to the File object
var file // the fileobject itself
var key // string
var value // string

}

あなたがしなければならない唯一のことはあなたの構造を定義することです(多分あなたのデータベースからエクスポートされます)そしてそれはそれです。

これがあなたが検索したものからそれほど遠くないことを願っています。

于 2012-06-20T15:35:42.363 に答える
0

参加を探しているようですね。これは、ファイルごとにメタが1つしかない場合に最適です。ファイルごとに複数のメタデータがあると、結果として多数の行が生成され、メタデータのみが異なります。ただし、写真データを表示しているので、これは正しくなく、ファイルごとに1つのメタしか取得しないと想定しているため、次のSQLをお勧めします。

SELECT 
    Files.*,
    Files_Meta.place, Files_Meta.author, Files_Meta.time, Files_Meta.camera, ..etc 
FROM 
    Files
JOIN Files_Meta ON Files_Meta.parent_id = Files.id

これにより、2つの別々のクエリでフェッチし、PHPを介して結合したデータで構成されるフラットな表現が得られます。データベースに依存することは、可能な場合は手動でつなぎ合わせるよりも常に優れており、parent_idとファイル内のidにインデックスが付けられている限り、クエリは非常に高速である必要があります。

于 2012-06-20T15:38:57.043 に答える