Mysql 通过相同的表联接(相同的透视表)获取相关对象。(使用联接将当前的3个查询简化为1-2个查询) MRE

Mysql 通过相同的表联接(相同的透视表)获取相关对象。(使用联接将当前的3个查询简化为1-2个查询) MRE,mysql,laravel,eloquent,eloquent-relationship,Mysql,Laravel,Eloquent,Eloquent Relationship,问题 我想检索属于某一研究领域的所有出版物,但这种关系是由常用关键字定义的。就是这样,如果一份出版物有一个或多个与研究系列相同的关键词,我们就说该出版物是该研究系列的一部分 我需要帮助键入以下关系。到目前为止,检索相关出版物需要3个不同的查询,我打赌这可以用更少的方式完成&以更整洁的方式完成,但我完全迷路了 结构: 我有以下表格(简化): 出版物研究出版物列id,标题 行研究行列id,标题 关键字关键字列id,名称 关键字关系包含关键字、出版物和研究行之间多对多关系的透视表列id,关键字id,

问题 我想检索属于某一研究领域的所有出版物,但这种关系是由常用关键字定义的。就是这样,如果一份出版物有一个或多个与研究系列相同的关键词,我们就说该出版物是该研究系列的一部分

我需要帮助键入以下关系。到目前为止,检索相关出版物需要3个不同的查询,我打赌这可以用更少的方式完成&以更整洁的方式完成,但我完全迷路了

结构: 我有以下表格(简化):

  • 出版物
    研究出版物
    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是的,我知道这是一个查询,但它看起来还是有点难看,这不能通过连接来实现吗?