0

我正在尝试在 MySQL 中实现某些目标,但即使在这里或其他站点上有所有答案,我仍然无法实现目标。

我有两张表,一对多的关系。

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

TABLE Files_Meta
COLUMNS id, parent_id, key, value

显然,每个文件都有多个元数据,表示为Files_Meta表中的多行。例如File1有 meta Author、Place、Time、Tags、Camera——如果它是一张照片。

我正在尝试从Files表中选择所有行,包括元数据。

标准结果

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

根据评论,您将需要 PHP 来创建所需的结构,因为 MySQL 仅以平面方式返回结果。

我强烈建议您编写代码以在单个查询或 2 个查询中执行此操作 - 一个用于所有人Files,另一个用于所有人Files_Meta。然后用 PHP 将数据拼接在一起否则,您可能会创建N+1 问题

顺便说一句,我建议更改parent_idfile_id. parent_id典型的表示自引用键。而file_id表示表的外键File

于 2012-06-20T15:39:58.167 回答
0

听起来你正在寻找加盟。如果每个文件只有一个元数据,那就太好了。每个文件不止一个元数据会导致大量结果行,只有元数据不同。但是,我假设由于您正在显示照片数据,因此这是不正确的,并且每个文件只会获得一个元数据,因此我建议使用以下 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

这将为您提供一个平面表示,其中包含您在两个单独的查询中获取的数据,然后通过 PHP 组合。依靠你的数据库总是比在可能的情况下手动拼接东西要好,只要文件中的 parent_id 和 id 被索引,查询应该很快。

于 2012-06-20T15:38:57.043 回答
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 回答