如何在表格中获得相关性分数

时间:2013-02-24 10:55:53

标签: mysql sql-order-by relevance

我有一个mysql表,其中包含游戏的类型标记,例如

game_typetags

   name   typetag
--------- --------
 game#1    sports
 game#1    soccer
 game#2    race
 game#2    sports

和另一个表games一样

   name   playcount 
--------- --------- 
 game#1      10      
 game#2      8 

我想列出相关游戏(用常见类型标记对其进行评分)并使用playcount排序。

所以我想在PHP中使用这样的数组:

function getSimilarGames($typetags_array)
{
$pdo->query("SELECT * FROM games COUNT (*) AS ???? ORDER BY games.playcount DESC");
}

因此,当我用$typetags = [race,sports]调用此函数时,它应该返回

name   score
____   _____
game#2   2
game#1   1

我应该使用什么查询? 谢谢!

2 个答案:

答案 0 :(得分:0)

我不同意您的数据库设计,您应该尝试将其标准化,但这里的代码可以用于您的设计:

SELECT games.name, COUNT(1) score
FROM games
INNER JOIN game_typetags ON game_typetags.name = games.name
WHERE game_typetags.typetag IN ('race', 'sports')
GROUP BY games.name
ORDER BY score DESC

我建议这样的设计;

game
-------
id integer pk
name varchar

typetag
-------
id integer pk
tagname varchar

game_typetags
-------
game_id int pk
typetag_id int pk

使用此设计,您可以使用ID将表连接在一起,而不是在任何地方使用字符串。

从中获取所需数据的查询可能如下所示,请注意您甚至可以使用tag-id使其更快(在数据库中处理主键而不是在where子句中进行字符串比较)

SELECT game.id, game.name, game.playcount, COUNT(1) score
FROM game
INNER JOIN game_typetags gtt ON gtt.game_id = game.id
INNER JOIN typetag tt ON tt.id = gtt.typetag_id
WHERE tt.typetag IN ('race', 'sports')
GROUP BY game.id
ORDER BY score DESC

答案 1 :(得分:0)

我找到了解决这个问题的方法,如下:

SELECT name, SUM(matches) as relevance_score FROM
(
SELECT
  game_typetags.*,
    (typetag =  'race'  )
+    (typetag =  'sports'  )
    AS matches
FROM game_typetags HAVING matches>0
ORDER BY matches DESC 
) a GROUP BY name ;