0

I have a mysql table that has typetags for games, like

table game_typetags:

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

and another table games like

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

And I want to list relevant games (score them with number of common typetags) and sort with playcount.

So I'm trying to get such an array in PHP:

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

So that when I call this function with $typetags = [race,sports] , it should return

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

What query should I use for this? Thanks !

4

2 に答える 2

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 に答える
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 に答える