我正在寻找一些关于如何寻找物品的一般建议,比如'现在的。
在我目前的例子中,我有三个这样的表(省略不相关的数据):
games
-game_id
genres
-genre_id
genres_data
-game_id
-genre_id
我怎样才能找到与当前类型相同的游戏类型的游戏,从具有相同类型的类型下降到仅与它有一个共同类型的游戏(当然限于几行)从游戏中获得一行?
找到类似项目的首选方法是什么?
答案 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);
}
您可以设置一个循环来为数据库中的每个游戏执行此操作,然后整理结果。我暂时想不出如何在一个查询中执行此操作。
我对你的问题有点不确定,因为你正在寻找最受欢迎的类型(因为这些类型的游戏可能会被退回,因为其他大多数游戏具有相同的类型)或者您正在寻找与其他可能更有用的游戏相同的游戏其他游戏玩法。