2010-12-12 70 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游戏。