Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL连接表一对多关系_Php_Mysql_Sql - Fatal编程技术网

Php MySQL连接表一对多关系

Php MySQL连接表一对多关系,php,mysql,sql,Php,Mysql,Sql,我试图在MySQL中实现一些东西,但即使在这里或其他网站上有了所有的答案,我仍然无法实现目标 我有两张桌子,一对多的关系 TABLE Files COLUMNS id, title, description, uploaded, size, extension, etc. TABLE Files_Meta COLUMNS id, parent_id, key, value 显然,每个文件都有多个元数据,表示为文件元表中的多行。例如,File1有元作者、地点、时间、标签、照相机(如果是照片的话

我试图在MySQL中实现一些东西,但即使在这里或其他网站上有了所有的答案,我仍然无法实现目标

我有两张桌子,一对多的关系

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

TABLE Files_Meta
COLUMNS id, parent_id, key, value
显然,每个文件都有多个元数据,表示为文件元表中的多行。例如,File1有元作者、地点、时间、标签、照相机(如果是照片的话)

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

标准结果 我想要什么 有可能在MySQL中实现这一点吗?如果没有这个数组,就不必像这样

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

提前感谢您的回复或提示。

因为您还标记了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进行组合。依靠您的数据库总是比尽可能手动将内容缝合在一起要好,只要父id和文件中的id被索引,查询就应该是闪电般的快。

在单个查询中执行此操作可以如下所示:

SELECT * FROM Files INNER JOIN Files_Meta ON Files.id = Files_Meta.parent_id
根据注释,您将需要PHP来创建所需的结构,因为MySQL只以平面方式返回结果

我强烈建议您编写代码,在一个查询或两个查询中完成此操作—一个用于所有文件,另一个用于所有文件。然后用PHP将数据缝合在一起。否则,您可以创建一个


另外,我建议将parent_id更改为file_id。parent_id通常表示自引用键的类型。而file_id将表示文件表的外键。

MySQL只能返回“平面”行,因此不,不是在严格的sql中,您必须在PHP中构建它,但它只需要2个查询&1个foreach循环。Wrikken是对的;您正在编写哪个查询?文件\u Meta.parent\u id是自引用的还是文件的外键@Wrikken,2个问题?你可以在1;是的,我用PHP很容易做到这一点,但查询是我问的原因。对于大量的文件+关联的元数据,查询的数量相当大,尽管它们是简单且非常快速的查询。files\u meta.parent\u id是文件的参考。id谢谢,我已经在搜索ORM解决方案。我已经选择了DataMapper或者我正在CodeIgniter上构建的条令。这可能会更容易:好吧,我正在使用symfony的条令,这很容易学习和使用。没有列文件\ u Meta.place或文件\ u Meta.author。只有文件_Meta.key。我已经编辑了我的答案,因为我在我的答案中遗漏了几个表名中的复数时态。然而,总体思路是相同的。您可以在查询中添加更多来自Files\u Meta的字段,以获得所需的所有字段。我选择了parent\u id,因为我在其他表类别、用户等中使用了类似的结构。不过,我必须承认,这不是很清楚。公平。但是如果你采用ORM,你可能会遇到麻烦。因为默认情况下他们可能会有这样的约定。这样,我得到的结果会多几倍——这取决于每个文件有多少元项。有没有合并它的方法?嗯,我现在正在调整ORM,所以解决方案可能就在那里:您可以通过添加WHERE来查询特定的记录。但这可能会导致效率低下,即N+1。然而,如果您使用ORM,它可能会为您解决所有这些问题。
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
SELECT * FROM Files INNER JOIN Files_Meta ON Files.id = Files_Meta.parent_id