MySQL多表匹配查询结果排序需求:优先双表匹配行
解决方案:按匹配优先级排序查询结果
你可以通过计算每行的匹配满足情况来指定排序规则,让同时匹配a、b表条件的记录排在最前面,仅匹配单个表条件的记录在后。以下是两种可行的实现方式:
方式一:使用CASE表达式明确排序权重
SELECT a.*, b.* FROM a INNER JOIN b ON a.id=b.id WHERE MATCH(a.column) AGAINST( 'something' IN BOOLEAN MODE) OR MATCH(b.column) AGAINST( 'something' IN BOOLEAN MODE) ORDER BY CASE -- 同时满足两个匹配条件的行,赋予最高权重2 WHEN MATCH(a.column) AGAINST( 'something' IN BOOLEAN MODE) AND MATCH(b.column) AGAINST( 'something' IN BOOLEAN MODE) THEN 2 -- 仅满足单个条件的行,权重为1 ELSE 1 END DESC;
方式二:利用MATCH返回值的相加结果排序
MATCH函数在BOOLEAN模式下,匹配成功会返回大于0的数值,匹配失败返回0。我们可以直接将两个MATCH的结果相加,按总和降序排列:
SELECT a.*, b.* FROM a INNER JOIN b ON a.id=b.id WHERE MATCH(a.column) AGAINST( 'something' IN BOOLEAN MODE) OR MATCH(b.column) AGAINST( 'something' IN BOOLEAN MODE) ORDER BY (MATCH(a.column) AGAINST( 'something' IN BOOLEAN MODE) + MATCH(b.column) AGAINST( 'something' IN BOOLEAN MODE)) DESC;
注意事项
- 修正了你原SQL中的拼写错误:
somthing改为something - 两种方式都能实现需求,第二种写法更简洁,第一种逻辑更直观,可根据习惯选择
内容的提问来源于stack exchange,提问作者Liam Morton
相关产品推荐
相关产品推荐

