物品'喜欢'这一个

时间:2010-12-12 05:31:08

标签: php mysql database-design

我正在寻找一些关于如何寻找物品的一般建议,比如'现在的。

在我目前的例子中,我有三个这样的表(省略不相关的数据):

games
-game_id

genres
-genre_id

genres_data
-game_id
-genre_id

我怎样才能找到与当前类型相同的游戏类型的游戏,从具有相同类型的类型下降到仅与它有一个共同类型的游戏(当然限于几行)从游戏中获得一行?

找到类似项目的首选方法是什么?

2 个答案:

答案 0 :(得分: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的列表,主查询使用该列表搜索genres_data以查找与其中一个匹配的任何记录。换句话说,它会搜索与您的“搜索游戏”相关联的任何类型相关的任何游戏。

由于游戏可以有多种类型,因此此查询会多次返回相同的game_id,如果您还在这些记录中报告了genre_id,则每个都会显示不同的genre_id 。我们如何找到最常见的结果是按每个game_id对结果进行分组,然后在主COUNT(genre_id)中添加SELECT以显示有多少genre_id game_id在该查询中返回的每个{{1}}都有。

从那里开始,按照降序排列常见类型的数量是一件简单的事情,因此将首先列出具有最多类型的游戏。

我还在主要查询中添加了第二个标准,以便从结果中排除您正在搜索的游戏,否则该游戏总是会有最多匹配,原因显而易见。

希望有所帮助。

答案 1 :(得分: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);

  }

您可以设置一个循环来为数据库中的每个游戏执行此操作,然后整理结果。我暂时想不出如何在一个查询中执行此操作。

我对你的问题有点不确定,因为你正在寻找最受欢迎的类型(因为这些类型的游戏可能会被退回,因为其他大多数游戏具有相同的类型)或者您正在寻找与其他可能更有用的游戏相同的游戏其他游戏玩法。