我有一个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
我应该使用什么查询? 谢谢!
答案 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 ;