如何确保已经从mysql中提取的项目不再被拉回来

时间:2010-12-15 06:35:46

标签: php mysql tags foreach

我正在创建一个相关的故事部分,该部分使用帖子中的标签来查找具有相似标签的其他故事。

我想确保如果它与另一个帖子共享多个标签,我不会多次拉同一个故事。

所以它基本上是

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'];
  }

所以我根据第一个标签拉出2个相关的故事,现在,当它通过第二个标签的下一个循环时,我怎样才能确保最后一次拉出的故事没有被选为第二个或第三个标签时间。我确实有一个名为'id'的唯一ID,在这种情况下不知道如何处理它。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以做的是一次性获取所有相关文章:

$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'];
}

,这不会影响您对LIMIT的使用。

修改
显然,这并没有造成问题,参见评价。

答案 1 :(得分:1)

使用UNIQUE。

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

答案 2 :(得分:0)

我认为你可以创建一个包含你选择的id的数组,当你处理一个标签时,检查id不在所选的数组中,但效率不高。

就像这样:

$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'];
  }
}