Select 来自 table 基于另一个 table 中的值 MySQL
Select from table based on values in another table in MySQL
我在数据库中有两个简单的 table
论文
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
我想要 select 所有具有关键字 "turtles" 的论文。也就是说,它会 return
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 和使用别名的内部连接 - 但语法不正确。
我试过了
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";
其中 return 是一个语法错误。
我知道有很多类似的查询,但我是 MySQL 的新手,对这些问题/示例感到困惑。
编辑:澄清我想要 return 来自 table 关键字(本例中为 1 和 3)的与关键字 "turtle" 匹配的 ID,然后 select 来自论文 table 与这些 ID 对应的行。我不想在标题中找到关键字。
我们可以尝试为每个论文标题搜索整组关键词,寻找匹配项。 REGEXP
运算符在这里很有用。特别是,我们希望将 \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[[:>:]]';
我很喜欢Tim's回答
这是我自己的尝试
SELECT
*
FROM
papers p
INNER JOIN keywords k ON p.`Title` LIKE CONCAT('%', k.keyword ,'%')
;
正如 Tim 对这个答案的评论,它将带来子字符串以及完整的单词匹配
为了解决这个问题,需要在 % parameters
中添加空格
SELECT
*
FROM
papers p
INNER JOIN keywords k ON p.`Title` LIKE CONCAT('% ', k.keyword ,' %')
;
简单连接(内部):
SELECT *
FROM keywords k
JOIN papers p USING (id)
WHERE k.keyword='turtles'
我在数据库中有两个简单的 table
论文
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
我想要 select 所有具有关键字 "turtles" 的论文。也就是说,它会 return
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 和使用别名的内部连接 - 但语法不正确。
我试过了
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";
其中 return 是一个语法错误。
我知道有很多类似的查询,但我是 MySQL 的新手,对这些问题/示例感到困惑。
编辑:澄清我想要 return 来自 table 关键字(本例中为 1 和 3)的与关键字 "turtle" 匹配的 ID,然后 select 来自论文 table 与这些 ID 对应的行。我不想在标题中找到关键字。
我们可以尝试为每个论文标题搜索整组关键词,寻找匹配项。 REGEXP
运算符在这里很有用。特别是,我们希望将 \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[[:>:]]';
我很喜欢Tim's回答
这是我自己的尝试
SELECT
*
FROM
papers p
INNER JOIN keywords k ON p.`Title` LIKE CONCAT('%', k.keyword ,'%')
;
正如 Tim 对这个答案的评论,它将带来子字符串以及完整的单词匹配 为了解决这个问题,需要在 % parameters
中添加空格SELECT
*
FROM
papers p
INNER JOIN keywords k ON p.`Title` LIKE CONCAT('% ', k.keyword ,' %')
;
简单连接(内部):
SELECT *
FROM keywords k
JOIN papers p USING (id)
WHERE k.keyword='turtles'