MySQL查询中的多个内部联接失败

MySQL查询中的多个内部联接失败,mysql,inner-join,Mysql,Inner Join,如果在查询中引用了{string},则以下操作有效,但如果包含它,则失败。到目前为止,在大多数帖子上有多个内部连接显然是有效的,实际上,没有任何反馈是值得的 SELECT DISTINCT species_tbl.* FROM species_tbl inner join species_common_names_tbl ON species_tbl.id = species_common_names_tbl.species_id { inner join

如果在查询中引用了{string},则以下操作有效,但如果包含它,则失败。到目前为止,在大多数帖子上有多个内部连接显然是有效的,实际上,没有任何反馈是值得的

SELECT DISTINCT species_tbl.* FROM species_tbl     
inner join species_common_names_tbl 
        ON species_tbl.id = species_common_names_tbl.species_id      
{
inner join species_synonyms_tbl ON species_tbl.id = species_synonyms_tbl.species_id
}    
WHERE
LOWER(species_tbl.keywords) LIKE LOWER('%Plain Rain Frog%') OR 
LOWER(species_common_names_tbl.common_name) LIKE LOWER('%Plain Rain Frog%')
{ 
OR 
LOWER(species_synonyms_tbl.syn_genus) LIKE LOWER('%Plain Rain Frog%') OR 
LOWER(species_synonyms_tbl.syn_sub_genus_name) LIKE LOWER('%Plain Rain Frog%') OR 
LOWER(species_synonyms_tbl.syn_species_epithet) LIKE LOWER('%Plain Rain Frog%') 
}
Ok做了一些测试,并注意到如果物种同义词tbl表与物种tbl表不相关,它将不会返回结果,因此它对事实的绑定期望出现一个关系id

CREATE TABLE IF NOT EXISTS `species_common_names_tbl` (
  `cn_id` int(11) NOT NULL AUTO_INCREMENT,
  `species_id` int(11) NOT NULL,
  `common_name` varchar(64) NOT NULL,
  `language` varchar(64) NOT NULL,
  PRIMARY KEY (`cn_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;


INSERT INTO `species_common_names_tbl` (`cn_id`, `species_id`, `common_name`, `language`) VALUES
(1, 1, 'Plain Rain Frog', 'English');



CREATE TABLE IF NOT EXISTS `species_synonyms_tbl` (
  `syn_id` int(11) NOT NULL AUTO_INCREMENT,
  `species_id` int(11) NOT NULL,
  `syn_genus` varchar(64) NOT NULL,
  `syn_sub_genus_name` varchar(64) NOT NULL,
  `syn_species_epithet` varchar(64) NOT NULL,
  PRIMARY KEY (`syn_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

INSERT INTO `species_synonyms_tbl` (`syn_id`, `species_id`, `syn_genus`, `syn_sub_genus_name`, `syn_species_epithet`) VALUES
(1, 2, 'test', 'test', 'test');


CREATE TABLE IF NOT EXISTS `species_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `keywords` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

INSERT INTO `species_tbl` (`id`, `keywords`) VALUES
(1, 'TEst');

感谢

这是因为您正在对
物种\u通用名称\u tbl
物种\u同义词\u tbl
表进行内部联接,因此您必须在两个表上都有匹配的记录-同义词表上提供的数据中唯一的记录是物种2

尝试将连接更改为外部连接,如下所示:

SELECT DISTINCT species_tbl.* FROM species_tbl     
left join species_common_names_tbl 
        ON species_tbl.id = species_common_names_tbl.species_id      
left join species_synonyms_tbl ON species_tbl.id = species_synonyms_tbl.species_id
WHERE LOWER(species_tbl.keywords) LIKE LOWER('%Plain Rain Frog%') OR 
      LOWER(species_common_names_tbl.common_name) LIKE LOWER('%Plain Rain Frog%') OR 
      LOWER(species_synonyms_tbl.syn_genus) LIKE LOWER('%Plain Rain Frog%') OR 
      LOWER(species_synonyms_tbl.syn_sub_genus_name) LIKE LOWER('%Plain Rain Frog%') OR 
      LOWER(species_synonyms_tbl.syn_species_epithet) LIKE LOWER('%Plain Rain Frog%') 
SQLFiddle

在确认性能问题后进行编辑-对于较大的数据集,以下各项的性能似乎更好:

SELECT DISTINCT species_tbl.* FROM species_tbl     
left join (select distinct species_id from species_common_names_tbl 
           where LOWER(common_name) LIKE LOWER('%Plain Rain Frog%')) scn
        ON species_tbl.id = scn.species_id      
left join (select distinct species_id from species_synonyms_tbl 
           where LOWER(syn_genus) LIKE LOWER('%Plain Rain Frog%') OR 
                 LOWER(syn_sub_genus_name) LIKE LOWER('%Plain Rain Frog%') OR 
                 LOWER(syn_species_epithet) LIKE LOWER('%Plain Rain Frog%') ) ss
        ON species_tbl.id = ss.species_id
WHERE LOWER(species_tbl.keywords) LIKE LOWER('%Plain Rain Frog%') OR 
      scn.species_id is not null OR 
      ss.species_id is not null

SQLFiddle。

当你说查询“失败”时,你的意思是当你试图执行它时它返回了一个错误,还是它执行了但没有返回你期望的数据?我认为物种同义词中的数据导致了查询失败。否则,您的查询都是正确的。请发布一些示例数据。查询不返回任何内容。我仔细检查了列名,结果正确。返回时没有错误,我正在从命令行运行查询。它在一条记录上运行得非常好,但当我尝试对18万行运行它时,返回结果需要很长时间。我两点后辞职minutes@MarkWatson:以下内容在更大的数据集上可能会表现得更好:@MarkWatson:不客气-我已经在我的答案中添加了另一种查询形式。