如果计数结果相等,请考虑其他字段

时间:2014-09-02 22:41:19

标签: mysql

enter image description here

我目前正在使用以下查询来查找" category_id"使用最多的是基于"名称"一件物品。

SELECT Name,category_id,COUNT(*) as count
FROM ex.item
where name LIKE '%living%' 
GROUP BY category_id ORDER by count DESC;

但是我遇到了计数结果相等的情况

enter image description here

所以我修改了我的查询以随机返回结果:

SELECT Name,category_id,COUNT(*) as count
FROM ex.item
where name LIKE '%living%' 
GROUP BY category_id ORDER by count,rand()  DESC LIMIT 1;

这有效但我想改进查询并删除rand()完全执行以下操作:

1)将subcategory_id考虑在内(在同一个表中),所以在上面的例子中,如果category_id 550是最常用的category_id,它有三个subategory_id列,两个用800,一个用900,然后返回category_id 500和subcategory_id 800是最常见的结果。

2)假设我们仍然按照上图中的方案返回相同的数字(即使我们包含了subategory_id),尝试使用item字段的描述(在同一个表中)查看查询字符串是否也出现在描述字段中,如果它出现在描述和名称中,则返回它在两者中出现的行作为普遍结果。

由于

1 个答案:

答案 0 :(得分:2)

1)您可以按多个值进行分组:

SELECT Name,category_id, subcategory_id, COUNT(*) as count
FROM ex.item
where name LIKE '%living%' 
GROUP BY category_id, subcategory_id ORDER by count DESC;

2)使用CASE语句计算可与其他因素结合的分数/体重/提升:

SELECT Name,case when description like '%living%' then 1 else 0 end as boost, category_id,COUNT(*) as count
FROM ex.item
where name LIKE '%living%' 
GROUP BY category_id ORDER by count DESC;

你没有问过的东西:

  • 如果这些类别被捆绑在一起,那么为什么不把它们带到那个类别呢? 让你赚钱最多(利润率最高,销售额最高, 等)?
  • 如果您在值的开头使用通配符,则 查询无法在该列上使用索引。查看文本搜索 功能(MySQL有一个,或者使用类似的东西 的solr / elasticsearch / cloudsearch)。这也可以帮助你获得评分。