0

我有一个带有游戏类型标签的 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

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

4

2 回答 2

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 将表连接在一起,而不是在任何地方使用字符串。

从中获取所需数据的查询可能如下所示,请注意,您甚至可以使用标记 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
于 2013-02-24T11:31:57.640 回答
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 ;
于 2013-02-24T12:09:27.077 回答