我有以下表格:
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.
这很好用,但我想如果有另一种方法来改进查询.
提前谢谢,伊克尔
在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的评论:
我并不是要反驳你,但我很确定我的查询是正确的,它不需要三个连接.以下是它的工作原理:
t2是在tag_news哪里的行集t2.idNews=$idNews.例如,如果$ idNews = 1,则会生成以下行:
idTag | idNews
1 | 1
2 | 1
Run Code Online (Sandbox Code Playgroud)从那里,我们希望tag_news中的所有其他行匹配任何相同的标记.所以t1.idTag=t2.idTag.这会产生给我们行t1.idTag IN (1,2):
idTag | idNews
1 | 1
2 | 1
1 | 2
2 | 2
2 | 3
Run Code Online (Sandbox Code Playgroud)从那里,返回news匹配任何值的所有行t1.idNews.换句话说,在哪里news.idNews IN (1,2,3).
idNews | title
1 | Title 1
2 | Title 2
3 | Title 3
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |