2010-12-15 29 views
1

我正在製作一個相關的故事板塊,它使用帖子中的標籤瀏覽並找到其他具有類似標籤的故事。如何確保已從MySQL中拉出的項目不再被拉動

我想確保我不會多次拉同一個故事,如果它與另一個帖子共享多個標籤。

所以基本上

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,只是不確定在這種情況下如何處理它。

謝謝!

回答

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

編輯
顯然這並不構成一個問題,參見。註釋。

+0

謝謝!看起來這是按預期工作。我只是在mysql_query的末尾扔了一個「LIMIT 5」,它看起來就像我想的那樣工作。 – Andelas 2010-12-15 06:59:09

+0

@scatteredbomb太好了。如果你沿着「爲每個標籤查找至多兩個相關文章但是不要兩次獲取同一文章」這一行,那麼這種方法就不適合了,這顯然是你不做的:) – jensgram 2010-12-15 08:07:26

+0

是的,原始查詢中限制2的唯一一點是因爲我無法想出一種方法,只能將其限制爲總共5個取決於標記數量的結果。這種方式完美地工作。 – Andelas 2010-12-15 08:55:42

1

使用UNIQUE。

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

但這些是單獨的查詢... – jensgram 2010-12-15 06:51:18

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