求一个 sql 语句或解决办法

2020-09-29 14:49:04 +08:00
 mxm145

有两个表 A,B 。A 表存的文章标题、发布时间这些信息,B 表存的是文章的内容,两个表的 ID 是一致的。现在的问题是:有关键词搜索的时候先在 A 表的标题里面进行搜索,再到 B 表的文章内容字段里面进行搜索,最后要把两个结果合并起来再按照 A 表的发布时间进行倒排。用了 SQL 的 union 搜索,在排序的时候就会把两个结果混合在一起,需要把 A 表的搜索结果按照时间排序放在前面,不知道各位有没有啥办法。

2310 次点击
所在节点    MySQL
8 条回复
RedBeanIce
2020-09-29 14:56:36 +08:00
感觉内容搜索,标题搜索,已经是 ES ????
LeeSeoung
2020-09-29 14:59:25 +08:00
A 排序 union all B 排序
DonaldY
2020-09-29 15:02:43 +08:00
查询 sql 时,多加个字段来标识数据源来自哪,order by 这个字段。
jiorix
2020-09-29 15:03:44 +08:00
select aa.*
from
(
select a.*, 1 as queryType
from a
where title like '%关键字%'
union
select a.*, 2 as queryType
from a
where a.id in (
select id from b where content like '%关键字%'
)
) as aa
order by queryType, ....
mxm145
2020-09-29 15:22:00 +08:00
@RedBeanIce 还是 mysql,没有用 es
@LeeSeoung 我查了 union 没办法用两个 order
@jiorix 多谢大佬的代码,思路我懂了

多谢各位的回复
liuky
2020-09-30 08:37:37 +08:00
select a.*
from A as a
inner join B as b on a.id = b.id
where a.title like '%key%' and b.content like '%key%'
order by a.createtime desc
mxm145
2020-09-30 14:32:58 +08:00
@liuky 这个跑出来的数据是 title 和 content 都有关键词的结果,我想要的是只要两个其中一个的都要显示出来,而且按照 title 匹配到的在前面,content 匹配到的在后面。如果把你的 and 改成 or 的话也不行
mxm145
2020-09-30 14:35:25 +08:00
我最后使用的是两个子查询 union 来实现的,参考这个: https://www.jianshu.com/p/2a53c2fdb042

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711575

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX