2012-09-11 19 views
3

我有一個搜索功能,當時搜索結果將顯示10。用戶可以查看下一個或前10個搜索結果。結果顯示不同的主題,其中搜索到的單詞將被發現。一切都像我想要的那樣工作。如何鏈接到搜索結果中的主題的正確頁面?

問題是當我希望用戶能夠點擊一個結果並最終在該主題的正確頁面上。例如,必須在第2頁上查看某個主題中的第14個帖子(在主題頁上的SQL查詢中使用LIMIT 10,10)。我在鏈接中發送LIMIT參數作爲$ _GET。

如何在按發佈日期排序時從特定主題的總數中檢索結果中每個主題的行號?一切都始終按此順序顯示。我想用$nr = $nr-1; //and then

$limit = floor($nr/10) * 10; 

上,這個數字將能夠在搜索結果中的鏈接發送正確LIMIT參數。

這裏的PDO用來獲取搜索結果:

$query = 'SELECT t.topic_id, t.topic_cat, t.topic_subject, p.post_content, p.post_id, UNIX_TIMESTAMP(p.post_date) AS post_date 
FROM posts p 
LEFT JOIN topics t ON p.post_topic = t.topic_id 
WHERE p.post_content LIKE :search OR t.topic_subject LIKE :search ORDER BY UNIX_TIMESTAMP(p.post_date) DESC LIMIT :start, :size'; 
$statement = $db->prepare($query); 
$statement->bindValue(':search', '%'.$search.'%'); 
$statement->bindValue(':start', $start2, PDO::PARAM_INT); 
$statement->bindValue(':size', $pagesize, PDO::PARAM_INT); 
$statement->execute(); 

    while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { 
     $array[$row['topic_subject']][] = $row['post_id']; 
     $nr = count($array[$row['topic_subject']]) - 1; 
     echo '<div class="search_result"><div class="search_topic"><a href="topic_view.php?id=' . $row['topic_id'] . '&amp;cat_id=' . $row['topic_cat'] . ' 
     &amp;start=' . floor($nr/10) * 10 . '#anchor_' . $row['post_id'] . '">' . $row['topic_subject'] . '</a><span style="float:right;color:#696969">' 
     . date("M d, Y",$row['post_date']) . '</span></div><div class="search_post">' . $row['post_content'] . '</div></div>'; 
    } 
} $statement->closeCursor(); 

它是start參數的鏈接,我莫名其妙地需要在查詢搶,所以我沒有做一個新的數據庫調用對於while loop中的每個post_id

+0

我不明白的問題。你有行號,你想知道它將在哪一頁上? – Tchoupi

+0

我有搜索結果中顯示的每個帖子的ID(每個結果的標題都是主題),但爲了能夠將用戶發送到該主題的正確頁面,我需要知道要在哪個數字中使用LIMIT子句。 – NewInTheBusiness

回答

3

假設,你只知道,在帖子的ID,我會是這樣的:

SELECT 
    count(*) 
FROM 
    `posts` 
WHERE 
    date <= (SELECT date FROM `posts` WHERE post_id = '$id') 
ORDER BY 
    date DESC; 

這會給你行數這個職位。之後,只需做一些PHP代碼,如:

$start = floor($nr/10) * 10; 
$end = ceil($nr/10) * 10; 

對於多個ID:

SELECT topic_id, (
    SELECT 
     count(*) 
    FROM 
     `posts` 
    WHERE 
     date <= (SELECT date FROM `posts` u1 WHERE u1.topic_id = u2.topic_id) 
    ) AS row 
FROM 
    `posts` u2 
WHERE 
    topic_id IN ('$id1', '$id2', '$id3') 
ORDER BY 
    date DESC; 
+0

我認爲它必須是WHERE topic_id ='$ topic_id'?因爲我需要該主題中該帖子的編號。 但是,我不會爲每個搜索結果做這個查詢嗎? – NewInTheBusiness

+0

我雖然你只需要一個,將在一分鐘內重寫。 – Peon

+0

好的。搜索結果與PDO一起顯示:while($ row = $ statement-> fetch(PDO :: FETCH_ASSOC)){}因此,以某種方式能夠在每個結果集中包含正確的開始參數額外選擇原始查詢。 – NewInTheBusiness

1
$query = 'SELECT :start as start, t.topic_id, t.topic_cat, t.topic_subject, 
p.post_content, p.post_id, UNIX_TIMESTAMP(p.post_date) AS post_date 
FROM posts p 
LEFT JOIN topics t ON p.post_topic = t.topic_id 
WHERE p.post_content LIKE :search OR t.topic_subject LIKE :search 
ORDER BY UNIX_TIMESTAMP(p.post_date) DESC LIMIT :start, :size'; 

然後通過$start = $row['start']

$nr = count($array[$row['topic_subject']])+$start - 1; 
相關問題