Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
Mysql 一对多关系查询_Mysql - Fatal编程技术网

Mysql 一对多关系查询

Mysql 一对多关系查询,mysql,Mysql,我真的被困在如何创建合适的select语句上,非常感谢您提供的任何指导 我创建了一个迷你文档管理系统,允许用户上传文件并按类别对这些文件进行分类。每个文件可以选择一个或多个类别。以下是我的表格: 表格:文件(pKey(主键)、文件名、文件描述、文件路径) 除此之外,还有其他部门,因此路径字段也会发生变化(我想我会把这一点数据抛进去) 表格:类别(pKey(主键)、类别描述) 当然还有其他类别,这只是一个抽样 表格:类别外部参照(pKey(主键)、fk\U文件id、fk\U类别id) 当用户搜索相

我真的被困在如何创建合适的select语句上,非常感谢您提供的任何指导

我创建了一个迷你文档管理系统,允许用户上传文件并按类别对这些文件进行分类。每个文件可以选择一个或多个类别。以下是我的表格:

表格:文件(pKey(主键)、文件名、文件描述、文件路径)

除此之外,还有其他部门,因此路径字段也会发生变化(我想我会把这一点数据抛进去)

表格:类别(pKey(主键)、类别描述)

当然还有其他类别,这只是一个抽样

表格:类别外部参照(pKey(主键)、fk\U文件id、fk\U类别id)

当用户搜索相关文档时,会显示一个带有类别复选框的表单。通过选择“中心”,它们将获得所有标记为中心的文件。通过选择桌面,他们可以获得任何标记为桌面的文档。但是,当他们选择“中心”和“桌面”时,他们会得到任何“中心”或“桌面”文档。我需要弄清楚如何仅获取那些同时是中央和台式机的文档以及它们选择的任何其他复选框,并排除不包含所有选中复选框的任何文档

SELECT f.pkID, f.file_name, f.file_description, f.file_path, cox.fk_category_id 
FROM files f
JOIN category_xref  cox ON cox.fk_file_id = f.pkID
WHERE cox.fk_category_id IN (59, 69)
ORDER BY f.file_name ASC, cox.fk_category_id ASC

最简单的方法可能是:

SELECT f.pkID, f.file_name, f.file_description, f.file_path
FROM files f
JOIN category_xref  cox ON cox.fk_file_id = f.pkID
WHERE cox.fk_category_id IN (59, 69)
GROUP BY f.pkID
HAVING count(distinct cox.fk_category_id)=2
ORDER BY f.file_name ASC

您可以尝试以下几行:

SELECT f.pkID, f.file_name, f.file_description, f.file_path
FROM files f
RIGHT JOIN category_xref  cox1 ON cox.fk_file_id = f.pkID AND cox1.fk_category_id = 59 
RIGHT JOIN category_xref  cox2 ON cox.fk_file_id = f.pkID AND cox2.fk_category_id = 69 
ORDER BY f.file_name ASC

这不是一对多。。。这是多对多:)。“一个文件有N个类别,在一个类别中有N个文件”NXN只适用于少数情况。。。如果文件有10个类别,你需要进行10次连接。在进行10次连接时,是否存在我不知道的问题?问题是性能。。。这个解决方案会起作用,但它可能真的很慢。我需要运行一个基准来确定,但我看不出它会变慢的原因。希望获得对相关基准或解释的引用。@PleasedOntAttery:只要求每个文件只获得一行,而不是像原始查询中那样,每个类别每个文件只获得一行。当然,如果每个文件只需要一行,这实际上是一个改进。关于Mark解决方案的快速问题。正在进行的计数..=2.我是否正确地假设2是所选复选框的数量,在本例中为复选框59和69?@JohnJost:是-因此,如果选中了3个复选框,则HAVING COUNT必须为3,依此类推。我是否可以展开此选择以添加到我的标记表中?每个文档不仅可以有类别,还可以有文档标记。因此,每个文件也可以链接到与上面的类别标记表类似的标记外部参照表。选择f.pkID、f.file\u name、f.file\u description、f.file\u path从cox.fk\u file\u id=f.pID JOIN tag\u xref t ON t.fk\u file\u id=f.pID上的文件f.pkID,其中cox.fk\u category\u id IN(59,69)和t.fk\u tag\u id IN(50,60)组中的cox.fk\u category\u id由具有count(不同cox.fk\u category\u id=2和count(不同t.fk\u标签)的f.pkID组成=2 ORDER BY f.file_name这似乎可行,但我将针对我的测试用例进行一些广泛的测试。非常非常感谢!
SELECT f.pkID, f.file_name, f.file_description, f.file_path, cox.fk_category_id 
FROM files f
JOIN category_xref  cox ON cox.fk_file_id = f.pkID
WHERE cox.fk_category_id IN (59, 69)
ORDER BY f.file_name ASC, cox.fk_category_id ASC
SELECT f.pkID, f.file_name, f.file_description, f.file_path
FROM files f
JOIN category_xref  cox ON cox.fk_file_id = f.pkID
WHERE cox.fk_category_id IN (59, 69)
GROUP BY f.pkID
HAVING count(distinct cox.fk_category_id)=2
ORDER BY f.file_name ASC
SELECT f.pkID, f.file_name, f.file_description, f.file_path
FROM files f
RIGHT JOIN category_xref  cox1 ON cox.fk_file_id = f.pkID AND cox1.fk_category_id = 59 
RIGHT JOIN category_xref  cox2 ON cox.fk_file_id = f.pkID AND cox2.fk_category_id = 69 
ORDER BY f.file_name ASC