Mysql 通过相同的表联接(相同的透视表)获取相关对象。(使用联接将当前的3个查询简化为1-2个查询) MRE
问题 我想检索属于某一研究领域的所有出版物,但这种关系是由常用关键字定义的。就是这样,如果一份出版物有一个或多个与研究系列相同的关键词,我们就说该出版物是该研究系列的一部分 我需要帮助键入以下关系。到目前为止,检索相关出版物需要3个不同的查询,我打赌这可以用更少的方式完成&以更整洁的方式完成,但我完全迷路了 结构: 我有以下表格(简化):Mysql 通过相同的表联接(相同的透视表)获取相关对象。(使用联接将当前的3个查询简化为1-2个查询) MRE,mysql,laravel,eloquent,eloquent-relationship,Mysql,Laravel,Eloquent,Eloquent Relationship,问题 我想检索属于某一研究领域的所有出版物,但这种关系是由常用关键字定义的。就是这样,如果一份出版物有一个或多个与研究系列相同的关键词,我们就说该出版物是该研究系列的一部分 我需要帮助键入以下关系。到目前为止,检索相关出版物需要3个不同的查询,我打赌这可以用更少的方式完成&以更整洁的方式完成,但我完全迷路了 结构: 我有以下表格(简化): 出版物研究出版物列id,标题 行研究行列id,标题 关键字关键字列id,名称 关键字关系包含关键字、出版物和研究行之间多对多关系的透视表列id,关键字id,
研究出版物列出版物
,id
标题
研究行列行
,id
标题
关键字列关键字
,id
名称
包含关键字、出版物和研究行之间多对多关系的透视表列关键字关系
,id
,关键字id
,父id
父类型
keyword\u relations
parent\u id
对于研究行为0,对于出版物为4
当前方法
1.)获取研究行的关键字
1
在本例中是某个研究行的ID。作为这个查询的结果,我得到了一个关键字ID数组
CREATE TABLE `publications` (
`id` mediumint unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `publications` (`title`)
VALUES
('Publication #1'),
('Publication #2'),
('Publication #3'),
('Publication #4'),
('Publication #5'),
('Publication #6');
CREATE TABLE `keywords_relation` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`keyword_id` mediumint unsigned DEFAULT NULL,
`parent_id` mediumint unsigned DEFAULT NULL,
`parent_type` tinyint unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `keywords_relation` (`keyword_id`,`parent_id`,`parent_type`)
VALUES
(1,1,0),
(2,1,0),
(4,1,0),
(1,2,0),
(4,2,0),
(6,3,0),
(6,4,0),
(6,2,0),
(2,1,0),
(3,4,0),
(3,5,4),
(4,6,4),
(4,2,4),
(5,1,4),
(5,3,4),
(6,4,4),
(6,6,4);
#1,2,4
select `keywords`.`id` from `keywords`
inner join `keywords_relation` on `keywords`.`id` = `keywords_relation`.`keyword_id`
where `keywords_relation`.`parent_id` = 1 and `keywords_relation`.`parent_type` = 0
2.)获取包含这些关键字的出版物的ID
(?,?,?)
将是从上一个查询中检索到的值。在本例中,是某个研究行的ID。作为这个查询的结果,我得到了一个关键字ID数组
CREATE TABLE `publications` (
`id` mediumint unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `publications` (`title`)
VALUES
('Publication #1'),
('Publication #2'),
('Publication #3'),
('Publication #4'),
('Publication #5'),
('Publication #6');
CREATE TABLE `keywords_relation` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`keyword_id` mediumint unsigned DEFAULT NULL,
`parent_id` mediumint unsigned DEFAULT NULL,
`parent_type` tinyint unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `keywords_relation` (`keyword_id`,`parent_id`,`parent_type`)
VALUES
(1,1,0),
(2,1,0),
(4,1,0),
(1,2,0),
(4,2,0),
(6,3,0),
(6,4,0),
(6,2,0),
(2,1,0),
(3,4,0),
(3,5,4),
(4,6,4),
(4,2,4),
(5,1,4),
(5,3,4),
(6,4,4),
(6,6,4);
#1,2,4
select `keywords`.`id` from `keywords`
inner join `keywords_relation` on `keywords`.`id` = `keywords_relation`.`keyword_id`
where `keywords_relation`.`parent_id` = 1 and `keywords_relation`.`parent_type` = 0
3)获取出版物
使用最后一个ID的结果,我们提供以下查询
select distinct `parent_id` from `keywords_relation` where `keyword_id` in (?, ?, ?) and `parent_type` = 4
其中,(?,?)
是出版物ID的列表
要求
有人能帮我整理一下吗?也许在使用联接的单个查询中可以实现?我想不出来
请注意,行和出版物之间的关系必须是松散的,也就是说,通过关键字
另外,我使用的是Laravel,所以每个表都代表一个模型(关键字/出版物/行)和一个轴(关键字活动)。如果有人想用雄辩的语言指出一个特定于laravel的解决方案
谢谢 @草莓在这里,你有它你不是刚刚解决了你的问题,通过生成小提琴的例子吗?(它的最后一个查询似乎是您问题的有效解决方案,例如,一个查询就可以给出您想要的结果)。@Solarflare是的,我知道这是一个查询,但它看起来还是有点难看,这不是可以通过连接实现的吗?@草莓在这里,您不是刚刚通过生成fiddle示例来解决您的问题吗?(它的最后一个查询似乎是对您的问题的有效解决方案,例如,一个查询就可以给出您想要的结果)。@Solarflare是的,我知道这是一个查询,但它看起来还是有点难看,这不能通过连接来实现吗?