按另一个表中字段中包含的大多数内容排序



>汽车表

---ID---    ----car----
1            bmw
2            mercedes
3            volvo

帖子表

---ID---      ----post----
1              I have a volvo car
2              I like volvo cars
3              I dont like bmw

我想得到一个结果,即从大多数包含在帖子文本中的汽车订购到更少。

预期成果:

Volvo
Bmw
Mercedes

您可以在此处尝试使用聚合进行简单的连接:

SELECT
c.car
FROM Cars c
LEFT JOIN Posts p
ON p.post LIKE CONCAT('%', c.car, '%')
GROUP BY
c.car
ORDER BY
COUNT(p.ID) DESC;

严格来说,我们应该使用正则表达式匹配来检测帖子中出现的汽车名称。REGEXP可用于此目的,然后连接条件将变为:

ON p.post REGEXP CONCAT('[[:<:]]', c.car, '[[:>:]]')

尝试在ORDER BY子句中使用相关的子查询:

select c.car
from Cars c
order by (
select count(*) 
from Posts p
where concat(' ', p.post, ' ') like concat('% ', c.car, ' %')
) desc 

我在每个列值前后添加了空格,以避免在car值包含在post的另一个单词中时出现误报结果。
请参阅演示。
结果:

| car      |
| -------- |
| volvo    |
| bmw      |
| mercedes |

最新更新