像这种关系查询怎样用join实现?

新闻表 news

nidtitleaddtimesort
1特朗普下台了2020-12-10
2拜登上台了2020-12-10
3马云人设崩了2020-12-20

分类表 newcate

cidcnameadd_time
1国内新闻2020-10-10
2国外新闻2020-10-10
3热点新闻2020-10-10

新闻分类关系表 new_cate_rel

ridc_id(分类id)n_id(文章id)
121
231
322
332
313

一个文章可以是多个分类,所以有这个 新闻分类关系表,存储关系。

例如:nid=1,的新闻, 特朗普下台了,即可以是 国外新闻,也是热点新闻。所以关系表有两条关系。


现在想查询出,国外新闻列表,怎么能查出来。

我只能用笨的方法,先查询出 分类关系表中,所有国外新闻的id集合,然后再,用in查询,去新闻表查询这些对应的id。感觉查询效率低下,想弄成join这种东西查询出来,搞不定,求大神帮忙一下。

阅读 2.3k
2 个回答
SELECT c.*
FROM newcate a
LEFT JOIN new_cate_rel b ON a.cid=b.c_id
LEFT JOIN news c ON b.n_id=c.nid
WHERE a.cname='国外新闻'
ORDER BY c.nid DESC
LIMIT 20;

先创建测试表

create table news (
nid INTEGER PRIMARY key,
title VARCHAR(32)
);

create table newcate (
cid INTEGER PRIMARY key,
cname VARCHAR(32)
);

create table new_cate_rel (
rid INTEGER PRIMARY key,
c_id INTEGER,
n_id INTEGER
);

insert into news values 
    (1,'特朗普下台了' ),
    (2,'拜登上台了'),
    (3,'马云人设崩了');
    
insert into newcate values 
    (1,'国内新闻' ),
    (2,'国外新闻'),
    (3,'热点新闻');
    
insert into new_cate_rel values 
    (1,2,1 ),
    (2,3,1 ),
    (3,2,2 ),
    (4,3,2 ),
    (5,1,3 );

然后使用内连接进行查询

select 
    * 
from
    new_cate_rel ncr inner join news n 
on 
    ncr.n_id = n.nid and ncr.c_id = 3
    
-- 如果一定要使用新闻类型的名称来查询,则还需要jioin一次
select 
    * 
from
    new_cate_rel ncr 
    inner join news n on ncr.n_id = n.nid
    inner join newcate on ncr.c_id = newcate.cid and newcate .cname = '国内新闻'
    
    

以上代码在mysql 8上测试通过,我觉得在这个例子中,只要做好索引然后正确使用,用in或者用join效率没有多少区别

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题