2010-12-15 75 views
1

Je crée une section d'articles similaires qui utilise les tags d'un post pour trouver d'autres articles avec des tags similaires.Comment m'assurer qu'un article déjà extrait de mysql ne se retire plus

Je veux m'assurer que je ne tire pas la même histoire plusieurs fois si elle partage plus d'une étiquette avec une autre publication.

Il est donc essentiellement

foreach($tags as $t) { 

    $getStories = mysql_query("SELECT * FROM `posts` WHERE `tags` LIKE '%$t%' LIMIT 2"); 

    while($related = mysql_fetch_array($getStories)) { 
    echo $related['title']; 
    } 

Je tire 2 histoires liées basé sur la première balise, maintenant, quand il fait le tour dans la boucle suivante pour la deuxième balise, comment puis-je faire en sorte que l'histoire a tiré la la dernière fois n'est pas sélectionnée la deuxième ou la troisième fois. J'ai un identifiant unique appelé 'id', mais je ne sais pas quoi faire dans cette situation.

Merci!

Répondre

2

Ce que vous pouvez faire est de chercher tous les articles connexes à la fois:

$tagsClause = ''; 
foreach ($tags as $t) { 
    $tagsClause .= " OR tags LIKE '%$t%'"; 
} 
$tagsClause = substr($tagsClause, 4); // Remove first ' OR ' 

$getStories = mysql_query('SELECT * FROM `posts` WHERE ' . $tagsClause); 
while($related = mysql_fetch_array($getStories)) { 
    echo $related['title']; 
} 

Cependant, cela ne tient pas compte de votre utilisation de LIMIT.

EDIT
Apparemment, cela ne posait pas de problème, cf. commentaires.

+0

Merci! On dirait que cela fonctionne comme prévu. J'ai juste jeté un "LIMIT 5" à la fin de la mysql_query et il semble que ça fonctionne comme je le voudrais. – Andelas

+0

@scatteredbomb Génial. Cette approche n'aurait pas été adaptée si vous faisiez quelque chose du genre "trouvez au plus deux articles liés pour chaque tag mais ne récupérez pas le même article deux fois", ce que, apparemment, vous ne * faites * pas :) – jensgram

+0

Oui, le seul point pour la limite 2 dans la requête d'origine était parce que je ne pouvais pas trouver un moyen de le limiter à un total de 5 résultats en fonction du nombre de balises. Cette façon de procéder fonctionne parfaitement. – Andelas

1

Utilisez UNIQUE.

SELECT UNIQUE(post_id), [other stuff] FROM posts WHERE [...] 
+0

Mais ce sont des requêtes séparées ... – jensgram

0

je pense que vous pouvez faire un tableau contenant les identifiants que vous avez sélectionné, lorsque vous traitez une étiquette, vérifiez l'ID est pas dans le tableau sélectionné, mais ce n'est pas efficace.

comme ceci:

$ids = array(); 
foreach($tags as $t) { 
    $getStories = mysql_query("SELECT * FROM `posts` WHERE `tags` = '$t' LIMIT 2"); 

    //here to check and add id to array ids 
    while($related = mysql_fetch_array($getStories)) { 
    echo $related['title']; 
    } 
}