![](/img/trans.png)
[英]SQL query to count rows grouped by an ID, but limit count on each group
[英]Select rows grouped by keyword but weight each group instead of using COUNT()
我使用MySQL数据库服务器,并且有一个名为keywords
的表,其结构如下:
kewyord_name | product_id
以及关键字列表。 我可以使用以下查询根据列表对keywords
表进行排序:
SELECT *, COUNT(*)
FROM keywords
WHERE keyword_name IN (comma separated list of keywords)
GROUP BY product_id
HAVING COUNT(*) > 2
ORDER BY COUNT(*) DESC
有没有一种方法可以增加关键字的权重,即对于某些关键字而言,COUNT(*)要增加一个以上?
如果您在关键字表中添加“权重”列,则可以使用总和(权重)和具有总和(权重)来代替Count(*)...
编辑:
select productid, Sum(weights.weight)
from Keywords
Join (Select 'keyword1' as keyword, 2 as weight
Union All
Select 'keyword2' , 5
Union All
Select 'keyword3', 6
) as weights
on Keywords.keyword_name = weights.keyword
group by productid
having Sum(weights.weight) > somevalue
order by weights.weight desc
使用COUNT(*)函数,每行只能加1。 如果希望以不同的方式对待关键字,则可以将SUM()函数与case块一起使用。
例如,假设您有关键字This
, that
, these
。 如果你想关键字this
和that
有重量的3, these
是2的重量,和其他任何权重为1,你可以这样做:
SELECT keyword_name,
SUM(CASE WHEN keyword_name IN ('this', 'that') THEN 3
WHEN keyword_name IN ('these') THEN 2
ELSE 1 END) AS weight
FROM myTable
GROUP BY keyword_name;
这是一个SQL Fiddle示例。
为了匹配您已有查询的设计,您只需要添加having和order by子句:
SELECT keyword_name,
SUM(CASE WHEN keyword_name IN ('this', 'that') THEN 3
WHEN keyword_name IN ('these') THEN 2
ELSE 1 END) AS weight
FROM myTable
GROUP BY keyword_name
HAVING weight > 2
ORDER BY weight DESC;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.