返回按相同列的总匹配顺序排列的结果

时间:2014-01-08 21:47:00

标签: mysql sql

我有下表:

+---------+------------+
| EntryID | CategoryID |
+---------+------------+
|      11 |         15 |
|      11 |         18 |
|     186 |         15 |
|     186 |         18 |
|     186 |        334 |
|     187 |         15 |
|     187 |         18 |
|     187 |        337 |
|     278 |         15 |
|     278 |         18 |
|     278 |        337 |
|     278 |        457 |
+---------+------------+

我希望按照匹配的相关性顺序得到结果,这是CategoryID rows / CategoryIDs specified的百分比。

我坚持认为,此计算需要处理多个categoryID个查询。例如,如果我要查找categoryID 18,entryID 11应该首先出现,因为它有50%的匹配百分比(请原谅我的陈词滥调命名),然后186或187来到第二匹配百分比为33%(在我的用例中,排序无关紧要),然后278将最后匹配百分比为25%。

我的问题是:有没有办法在一个/多个SQL查询/查询中进行这种排序? Java可以随时使用,所以我可以用Java而不是MySQL排序,但我我想看看是否有纯SQL解决方案。另外,是否有更好的方法来计算我的案例中的相关性?

(只是为了好玩,这个问题有更好的标题吗?

1 个答案:

答案 0 :(得分:3)

听起来你想要这样的东西:

select EntryID, count(*)
from your_table
group by EntryID
order by count(*) asc

更新:根据更新后的问题,这是实现这一目标的一种方法:

select your_table.EntryID, count(*) as matches, sub_query.total_rows
from your_table
inner join (
  select EntryID, count(*) as total_rows
  from your_table
  group by EntryID
) sub_query on sub_query.EntryID = your_table.EntryID
where your_table.CategoryID = 18
group by your_table.EntryID
order by (count(*) / sub_query.total_rows) desc