我在数据库中有两个简单的表
论文
ID Title Author
1 A study of turtles Mary
2 Dietary habits of ducks Kate
3 Similarities of turtles and cats Fred
关键字
ID Keyword
1 turtles
2 ducks
3 turtles
3 cats
我想选择所有包含关键字“ turtles”的论文。也就是说,它将返回
ID Title Author
1 A study of turtles Mary
3 Similarities of turtles and cats Fred
或
ID Title Author Keyword
1 A study of turtles Mary turtles
3 Similarities of turtles and cats Fred turtles
我不担心是否包含关键字标题。
我认为我需要使用使用别名的选择和内部联接-但语法不正确。
我尝试过
select * from (select papers.*, keywords.* from papers inner join keywords on papers.id = keywords.id) where keyword = "turtles";
给出错误Every derived table must have its own alias
我尝试关注What is the error "Every derived table must have its own alias" in MySQL?
select * from (select papers.*, keywords.* from
(papers inner join keywords on papers.id = keywords.id) as T)
as T)
where keyword = "turtles";
返回语法错误。
我知道有很多类似的查询,但是我是MySQL的新手,并且对问题/示例感到困惑。
编辑:澄清一下,我想从表关键字(此示例中为1和3)返回与关键字“ turtle”匹配的ID,然后从papers表中选择与这些ID对应的行。我不想在标题中找到关键字。
答案 0 :(得分:1)
我们可以尝试为每个论文标题搜索整个关键字集,以寻找匹配项。 \bkeyword\b
运算符在这里很有帮助。特别是,我们希望将SELECT p.*
FROM papers p
WHERE EXISTS (SELECT 1 FROM keywords k
WHERE p.title REGEXP CONCAT('[[:<:]]', k.keyword, '[[:>:]]'));
与论文标题中的任何地方进行匹配。
turtles
编辑:
如果您只想针对单个已知关键字搜索论文标题,例如SELECT *
FROM papers
WHERE title REGEXP '[[:<:]]turtles[[:>:]]';
,然后使用以下简化方法:
MetaData
答案 1 :(得分:0)
我真的很喜欢Tim's答案
这是我自己的尝试
SELECT
*
FROM
papers p
INNER JOIN keywords k ON p.`Title` LIKE CONCAT('%', k.keyword ,'%')
;
正如蒂姆(Tim)在回答此问题时所说,它将带来子字符串以及完整的单词匹配 为了解决这个问题,需要在%参数中添加空格
SELECT
*
FROM
papers p
INNER JOIN keywords k ON p.`Title` LIKE CONCAT('% ', k.keyword ,' %')
;
答案 2 :(得分:0)
简单加入(内部):
SELECT *
FROM keywords k
JOIN papers p USING (id)
WHERE k.keyword='turtles'