2013-02-24 58 views
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 

我應該使用什麼查詢這個? 謝謝!

回答

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 
+0

感謝。這實際上是我通過這種方式來規範化表格的嘗試:) – marvin 2013-02-24 12:08:20

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 ;