2010-12-12 5 views
0

Je suis à la recherche de conseils généraux sur la façon de trouver des articles «comme» ceux qui sont en cours.Articles semblables à celui-ci

Dans mon exemple actuel, j'ai trois tableaux comme si (en omettant des données non liées):

games 
-game_id 

genres 
-genre_id 

genres_data 
-game_id 
-genre_id 

Comment puis-je faire pour trouver des jeux qui ont des genres en commun avec l'actuel, de ceux qui ont tout les mêmes genres, descendant à ceux qui en ont un en commun (limité bien sûr à quelques lignes) avec une rangée donnée de jeux?

Quelle est la méthode préférée pour trouver des articles similaires?

Répondre

2

Essayez ceci:

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 
; 

La sous-requête saisit une liste de tous les genre_id s associés à votre jeu, et la principale requête utilise pour rechercher genres_data pour tout enregistrement qui correspond à l'un d'entre eux. En d'autres termes, il recherche tout jeu associé à un genre auquel votre «jeu de recherche» est associé.

Parce qu'un jeu peut avoir plusieurs genres, cette requête retournerait les mêmes game_id plusieurs fois, et si vous avez aussi signalé le genre_id sur ces dossiers, ils auraient chacune un autre genre_id. Ce que nous faisons pour trouver ceux qui ont le plus en commun est de grouper les résultats par game_id, et nous ajoutons le COUNT(genre_id) dans le SELECT principal pour montrer combien de différents genre_id il y avait pour chaque game_id retourné dans cette requête. De là, il suffit de trier les genres communs par ordre décroissant, de sorte que les jeux ayant le plus de genres en commun soient listés en premier.

J'ai également ajouté un deuxième critère à la requête principale pour exclure le jeu que vous recherchez des résultats, sinon ce jeu aurait toujours le plus de correspondances, pour des raisons évidentes.

Espérons que ça aide.

+0

Désolé j'ai pris si longtemps répondre à cela. StackOverflow est tombé en panne pour la maintenance juste au moment où j'allais publier cette réponse. – AgentConundrum

+0

Yah, il est descendu juste après que je l'ai posté, je suis allé le regarder après et il était parti; merci c'est un bon point de départ, je ne savais pas comment faire ce genre de chose –

0

Sûrement la façon de le faire pour un seul jeu est d'abord saisir ses genres et ensuite en boucle sur eux pour créer une nouvelle requête:

$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); 

    } 

Vous pouvez configurer une boucle pour le faire pour tous les jeu dans la base de données, puis rassembler vos résultats. Je ne peux pas penser à la façon de le faire dans une seule requête pour le moment. Je suis également un peu incertain sur votre question car vous cherchez les genres qui sont les plus populaires (comme les jeux avec ces genres seront probablement retournés comme ayant le plus d'autres jeux avec le même genre en commun) ou vous recherchez individuellement d'autres game_ids de jeux en commun avec un autre jeu qui pourrait être plus utile.