MySQL查询中的多个内部联接失败
如果在查询中引用了{string},则以下操作有效,但如果包含它,则失败。到目前为止,在大多数帖子上有多个内部连接显然是有效的,实际上,没有任何反馈是值得的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
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:不客气-我已经在我的答案中添加了另一种查询形式。