[英]MySQL joining tables one-to-many relationship
我正在尝试在MySQL中实现某些目标,但是即使在这里或其他站点获得了所有答案,我仍然无法实现目标。
我有两个表,一对多关系。
TABLE Files
COLUMNS id, title, description, uploaded, size, extension, etc.
TABLE Files_Meta
COLUMNS id, parent_id, key, value
显然,每个文件都具有表示为Files_Meta表中许多行的多个元数据。 例如, File1具有元作者,位置,时间,标签,相机-如果是照片。
我正在尝试从文件表中选择所有行,包括元数据。
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
)
在此先感谢您的答复或提示。
可以在单个查询中执行以下操作:
SELECT * FROM Files INNER JOIN Files_Meta ON Files.id = Files_Meta.parent_id
根据注释,您将需要PHP创建所需的结构,因为MySQL仅以固定方式返回结果。
我强烈建议编写您的代码以通过单个查询或两个查询来执行此操作-一个查询所有Files
,另一个查询所有Files_Meta
。 然后使用PHP将数据缝合在一起。 否则,您可能会创建N + 1问题 。
parent_id
file_id
,我建议将parent_id
更改为file_id
。 parent_id
通常表示自引用密钥。 而file_id
将表示File
表的外键。
正如您还标记了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
}
您唯一要做的就是定义您的结构(也许从数据库中导出),然后就可以了。
我希望这与您搜索的内容相距不远。
听起来您正在寻找联接。 如果每个文件只有一个meta,那就太好了。 每个文件一个以上的元数据将导致大量结果行,而只有元数据不同。 但是,我假设由于您正在显示照片数据,所以这不是正确的,并且每个文件只能得到一个元数据,因此我建议使用以下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,查询就应该很快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.