>汽车表
---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 |