1

汽车表

---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
4

2 回答 2

0

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

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, '[[:>:]]')
于 2020-01-26T11:58:44.437 回答
0

尝试在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值包含在 a 中的另一个单词中post
请参阅演示
结果:

| car      |
| -------- |
| volvo    |
| bmw      |
| mercedes |
于 2020-01-26T15:05:44.420 回答