使用三个SELECT优化SQL查询

Ike*_*uez 1 sql

我有以下表格:

news
idNews | title
1      | Title 1
2      | Title 2
3      | Title 3
4      | Title 4

tags
idTag | name
1     | Name_tag1
2     | Name_tag2
3     | Name_tag3
4     | Name_tag4
Run Code Online (Sandbox Code Playgroud)

MappingTable:

tag_news
idTag | idNews
1     | 1
2     | 1
1     | 2
2     | 2
2     | 3
3     | 3
4     | 3
4     | 4
Run Code Online (Sandbox Code Playgroud)

我想通过给一个idNews来获取几乎有一个共同标签的相关新闻的标题.我能用三个SELECT做到这一点:

SELECT title FROM news WHERE idNews IN 
 (SELECT DISTINCT idNews FROM tag_news 
  WHERE idTag IN 
  (SELECT idTag FROM tag_news WHERE idNews='$idNews'))
Run Code Online (Sandbox Code Playgroud)

其中$ idNews标识我通过参数提供的ID.

这很好用,但我想如果有另一种方法来改进查询.

提前谢谢,伊克尔

Bil*_*win 6

在SQL中编程时,您确实需要了解联接.连接是SQL的基础,因为while循环是大多数其他编程语言的基础.

SELECT DISTINCT n.title FROM news n
INNER JOIN tag_news t1 ON t1.idNews = n.idNews
INNER JOIN tag_news t2 ON t1.idTag = t2.idTag
WHERE t2.idNews = $idNews;
Run Code Online (Sandbox Code Playgroud)

SQL连接的可视化解释开始


来自@Beth的评论:

我并不是要反驳你,但我很确定我的查询是正确的,它不需要三个连接.以下是它的工作原理: