2010-12-12 68 views
0

我正在尋找一些關於如何去尋找物品的一般建議'像'目前的一個。項目'喜歡'這一個

在我目前的例子,我有三個表像這樣(忽略不相關的數據):

games 
-game_id 

genres 
-genre_id 

genres_data 
-game_id 
-genre_id 

我該如何去尋找遊戲,有共同的風格與當前的一個,從具有所有的人相同的流派,下降到只有一個與它共同的流派(限制到幾行)與遊戲給定的排?

尋找類似物品的首選方法是什麼?

回答

2

試試這個:

SELECT game_id, COUNT(genre_id) AS genres_in_common 
FROM genres_data 
WHERE 
    genre_id IN 
     (
     SELECT genre_id 
     FROM genres_data 
     WHERE game_id = <game you're searching with> 
     ) 
    AND 
     game_id != <game you're searching with> 
GROUP BY game_id 
ORDER BY genres_in_common DESC 
; 

子查詢抓住與遊戲相關的所有genre_id s的名單,主要查詢使用搜索genres_data對符合其中之一的任何記錄。換句話說,它搜索與您的「搜索遊戲」相關的任何類型的任何遊戲。

因爲一場比賽可以有多個流派,這個查詢將返回相同的game_id多次,如果您還報告了這些記錄的genre_id他們將各自展現出不同的genre_id。我們如何找到最常見的是將結果按照每個game_id進行分組,然後在主要的SELECT中添加COUNT(genre_id),以顯示該查詢中返回的每個game_id有多少個不同的genre_id

從那裏開始,按照降序排列常見流派的數量是一件簡單的事情,所以最常見的流派將會列在第一位。

我還爲主要查詢添加了第二條標準,以便從搜索結果中排除您正在搜索的遊戲,否則該遊戲始終會有最匹配的結果,原因很明顯。

希望有所幫助。

+0

對不起,我花了這麼長的時間來回答這個問題。就在我要發佈這個答案時,StackOverflow進行維護。 – AgentConundrum 2010-12-12 06:47:14

+0

Yah在我發佈後立即下樓,之後我去看它,它已經不在了;感謝這是一個很好的起點,我不知道如何去做這類事情 – 2010-12-12 15:54:45

0

當然對於只是一個單一的遊戲做到這一點的方法是,首先抓住它的類型,然後遍歷它們來創建一個新的查詢:

$query = "SELECT `genre_id` FROM `genres_data` WHERE `game_id` = 'your_game_id_here';" 
$genre_id_result = mysql_result($query, $dbconn); 
$num = mysql_num_rows($genre_id_result); 

if ($num > 0) { 

    $query = "SELECT `game_id` FROM `games` WHERE "; 

    for ($i=0;$i<$num;$i++) { 

     $genre_id = mysql_result($genre_id_result, $i, "genre_id"); 

     if ($WhereSQL == "") { 
       $WhereSQL = "genre_id = '$genre_id' " 
      } else { 
       $WhereSQL .= "AND genre_id = '$genre_id' " 
      } 
     } 

     $GamesInCommonResult = mysql_result($query . $WhereSQL, $dbconn); 

    } 

你可以建立一個循環,每一個做到這一點數據庫中的遊戲,然後整理你的結果。我現在無法想象如何在單個查詢中執行此操作。

我對你的問題也有點不確定,因爲你要找的是最受歡迎的流派(因爲有這些流派的遊戲可能會因爲擁有相同流派的大多數其他遊戲而被歸還),或者你正在單獨尋找與另一個可能更有用的遊戲相同的其他game_id遊戲。