2013-06-05 127 views
2

我有一個包含1500多個在線遊戲數據的SQL表。每個遊戲都有標籤描述(每場比賽1到5個標籤)。例如,this game在重要性的順序中包含以下標籤「越野自行車」,「賽車」,「特技」,「試用」,「山」。對於每一款遊戲,我都想選擇最相關的12款遊戲。MySQL數據比較

我在考慮給每個標籤賦予一個「重要性順序」權重。

標籤1 = 5分

標籤2 = 4分

標籤3 = 3分

標籤4 = 2分

標籤5 = 1磅

而乘以匹配的標籤。所以如果另一場比賽是關於「賽車」,「賽車」,「山」,它會得到:0 +(4 x 4)+(3 x 1)= 19pts。然後,我會比較所有比賽的結果並以最高分顯示12。

我知道如何使用PHP編寫數學比較部分,但不知道如何在僅顯示前12場比賽之前有效存儲局部結果(即每個1500的比較點)。我應該創建一個表來存儲臨時1500結果嗎?或者有沒有辦法將這些結果存儲在內存中,然後只抓取前12個?

注意:我可能會將最終結果存儲在1500x12的SQL表中,並且僅在我將添加新遊戲時進行比較,大約每天一次。

+0

有趣!這是一個非常酷的主意! +1 – pattyd

+1

這個問題目前有點寬泛 - 這是一個有趣的問題,但它可能不適合這裏。你當然可以用PHP來做到這一點,但如果你放棄它,那麼可能會更好,然後在遇到困難時詢問具體的問題。 – halfer

+1

你的問題是什麼?請描述你有問題的部分。 –

回答

0

繼承人一些SQL,也許這將工作?:

SELECT g.id AS game_id, g.game AS game_name, SUM(t.tag_points) AS tag_points 
FROM games g 
INNER JOIN game_tags gt 
    ON gt.game_id = g.id 
INNER JOIN tags t 
    ON t.id = gt.tag_id 
GROUP BY gt.game_id 
ORDER BY tag_points DESC 

您將需要一個類似的表結構:

Table: games 
+----+-------------+ 
| id | game  | 
+----+-------------+ 
| 1 | Test Game 1 | 
| 2 | Test Game 2 | 
+----+-------------+ 

Table: tags 
+----+------------+------------+ 
| id | tag_name | tag_points | 
+----+------------+------------+ 
| 1 | test tag 1 | 1   | 
| 2 | test tag 2 | 2   | 
+----+------------+------------+ 

Table: game_tags 
+----+---------+--------+ 
| id | game_id | tag_id | 
+----+---------+--------+ 
| 1 | 1  | 1  | 
| 2 | 2  | 1  | 
| 3 | 2  | 2  | 
+----+---------+--------+ 
2

雖然這個問題應該被視爲過於寬泛,是一個這很適合(請在問之前嘗試一些東西!),這足以讓我回答它。

我不會在PHP中這樣做,而是在純SQL中。

假設像這樣的結構:

CREATE TABLE game (
    game_id INT PRIMARY KEY, 
    name VARCHAR(50) 
); 

CREATE TABLE tag (
    tag_id INT PRIMARY KEY, 
    label VARCHAR (50) 
); 

CREATE TABLE gametag (
    game_id INT, 
    tag_id INT, 
    rank INT, -- ranks from 1 to 5, rank "1" will weightmeans "5 points" 
    PRIMARY KEY (game_id, tag_id), 
    UNIQUE (game_id, tag_id, rank), 
    CONSTRAINT gid_fk FOREIGN KEY gid_fk_idx (game_id) REFERENCES game (game_id), 
    CONSTRAINT tid_fk FOREIGN KEY tid_fk_idx (tag_id) REFERENCES tag (tag_id) 
); 

的 「匹配得分」 兩場之間將與這樣的查詢來獲得:

SELECT 
    game1.name AS game_1, 
    game2.name AS game_2, 
    SUM(match_score) AS score 
FROM (
    SELECT 
     game1.game_id AS game1_id, 
     game2.game_id AS game2_id, 
     (6 - gametag1.rank) * (6 - gametag2.rank) AS match_score -- modify the magic "6" if you allow more or less than 5 tags 
    FROM game AS game1 
    JOIN gametag AS gametag1 USING (game_id) 
    JOIN tag AS tag1 USING (tag_id) 
    JOIN tag AS tag2 USING (tag_id) 
    JOIN gametag AS gametag2 USING (tag_id) 
    JOIN game AS game2 ON game2.game_id = gametag2.game_id 
    WHERE game1.game_id = 1 AND game2.game_id = 2 
) AS scores 
JOIN game AS game1 ON game1.game_id = game1_id 
JOIN game AS game2 ON game2.game_id = game2_id 
GROUP BY game1_id, game2_id; 
0

tags

id | name | 
------------------ 
1 | cars | 
2 | rpg  | 
3 | shooter | 
4 | mountain | 
5 | fps  | 
6 | trial | 
7 | racing | 
8 | ....  | 
9 | ....  | 

games

id | name | 
------------------ 
1 | race_game | 
2 | shoot_game | 

game_tags

id | game_id | first_tag | second_tag | third_tag | fourth_tag | fifth_tag | 
----------------------------------------------------------------------------- 
1 | 1  | 7  |  1  |  4  |  2 | 6  | 
2 | 2  | 5  |  8  |  3  |  2 | 9  | 

這樣你就可以LEFT JOIN的game_tags多的時間來比較,其中從第一個加入標籤等於第二個連接等等。LEFT JOIN會給你非匹配值的NULL結果,所以只有匹配纔會有tag_id。根據哪個標籤匹配,你可以給點。例如,如果這裏的匹配從第四個標籤開始,那麼根據我的理解,您將給出第四個標籤的分數,first_tag匹配會給出更多的分數,然後隨着標籤的排名而降低。