簡體   English   中英

選擇按關鍵字分組的行,但對每個組加權,而不是使用COUNT()

[英]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塊一起使用。

例如,假設您有關鍵字Thisthatthese 如果你想關鍵字thisthat有重量的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM