SELECT links.*
FROM links
INNER JOIN (
SELECT keywords_links.link_id
FROM keywords_links
INNER JOIN keywords ON keywords_links.keyword_id = keywords.id
WHERE keywords.keyword
IN ("facebook", "google", "apple")
GROUP BY keywords_links.link_id
) t
ON links.id = t.link_id
返回与关键字匹配的链接。我有3个表:links
,keywords
和keywords_links
。 keywords_links
将关键字与链接相关联。
如何使此查询更有效?我对MySQL缺乏经验,所以我不得不使用基本的MySQL命令来创建这个查询。
表格(仅显示相关信息):
链接:
CREATE TABLE IF NOT EXISTS `links` (
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=337789 ;
keywords_links:
CREATE TABLE IF NOT EXISTS `keywords_links` (
`keyword_id` int(11) NOT NULL,
`link_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
关键字:
CREATE TABLE IF NOT EXISTS `keywords` (
`id` int(11) NOT NULL auto_increment,
`keyword` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `sort` (`id`,`keyword`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=60363 ;
答案 0 :(得分:0)
SELECT DISTINCT
l.*
FROM
links l
INNER JOIN keyworks_links kl ON kl.link_id = l.id
INNER JOIN keywords ON kl.keyword_id = k.id
WHERE
k.keyword IN ("facebook", "google", "apple")
;
编辑添加 DISTINCT 以删除重复项
答案 1 :(得分:0)
查询本身没问题。性能问题可能是它必须对keywords_links
进行全表扫描才能匹配关键字,并对关键字进行全表扫描以查找匹配项。
尝试将表格结构更改为:
CREATE TABLE IF NOT EXISTS `keywords` (
`id` int(11) NOT NULL auto_increment,
`keyword` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `sort` (`id`,`keyword`),
INDEX (keyword)
) ;
这会加快关键字匹配(您也可以使用create index
)。
接下来,您可以更快地找到链接:
CREATE TABLE IF NOT EXISTS `keywords_links` (
`keyword_id` int(11) NOT NULL,
`link_id` int(11) NOT NULL,
unique (keyword_id, link_id)
);
通过索引查找匹配关键字然后通过索引查找链接的组合可以加快查询速度。