2008-10-17 110 views
3

我正在研究論壇系統。我試圖讓用戶看到他們發佈的帖子。爲了讓這個鏈接起作用,我需要跳到頁面關於他們發佈的帖子中的特定主題,以便書籤可以工作等。由於這是舊論壇的新功能,我想編寫代碼,以便論壇系統不必跟蹤每篇文章,但可以自動填充此列表。SQL - 在某個查詢中查找某個行將在的位置

我知道如何填充列表,但我需要這樣做:

給定查詢,其中將在查詢中X行(保證是由標識符的組合是唯一的)出現在哪裏?如在,我需要抵消多少行才能到達它?這將在一個有序的查詢中。

理想情況下,我想用SQL而不是PHP來做這件事,但如果它不能在SQL中完成,我想這也是一個答案。^_^

感謝

回答

3

嗯這個解決方案讓幾個假設,但我認爲它應該爲你想要做什麼工作,如果我理解正確:

SELECT count(post_id) FROM posts 
    WHERE thread_id = '{$thread_id}' AND date_posted <= '{$date_posted}' 

這將讓你的行數在特定的線程(我假設你已經預先計算),它等於或早於發佈日期(特定用戶帖子)。

根據這些信息(比如說該帖子中的第15篇文章),你可以根據論壇的分頁值計算結果將會在哪個頁面上。即

// dig around forum code for number of items per page 
$itemsPerPage = 10; // let's say 
$ourCount = getQueryResultFromAbove(); 

// this is the page that post will be on 
$page = ceil($ourCount/$itemsPerPage); 

// for example 
$link = '/thread.php?thread_id='.$thread_id.'&page='.$page; 
+0

我喜歡這個,因爲它不會在一個查詢中的所有行... – Cervo 2008-10-17 18:34:13

+0

Oohhh ......聰明確實如此。謝謝! – 2008-10-18 07:23:28

0

關於數據庫的事情是,有沒有真正的「命令」他們。您可以使用SCOPE_IDENTITY運算符返回插入記錄的唯一ID,然後編寫某種函數以分頁,直到找到該記錄。

2

如果您使用的是MSSQL,則可以使用ROW_NUMBER()函數爲查詢中的每一行添加一個自動遞增的數字。

我不知道這會對你有什麼好處。但它會完成你所要求的 - 在給定查詢的結果集內爲一行的位置分配一個數字。

如果這是用ph編寫的,你可能使用mySQL。

0

擴展在特洛伊的建議,你需要一個子查詢,基本上

select row_number() OVER(ORDER BY MessageDate DESC) 
AS 'RowNum', * from MESSAGES 

然後把外選擇做真正的工作:

select RowNum, Title, Body, Author from (
    select row_number() OVER(ORDER BY MessageDate DESC) 
    AS 'RowNum', * from MESSAGES) 
    where AuthorID = @User 

使用rownum來計算頁碼。

0

我特洛伊同意,你可能錯誤地去解決這個問題,要解決這個問題,我們就必須瞭解更多的細節,但在MySQL的任何情況下,你可以是這樣做的

SET @i=0; 
SELECT number FROM (SELECT *,@i:[email protected]+1 as number FROM Posts 
ORDER BY <order_clause>) as a WHERE <unique_condition_over_a> 

在PostgreSQL你可以使用一個臨時序列:

CREATE TEMPORARY SEQUENCE counter; 
SELECT number FROM (SELECT *,nextval('sequence') as number FROM Posts 
ORDER BY <order_clause>) as a WHERE <unique_condition_over_a> 
0

我認爲你的意思是這樣的(MySQL)?

START TRANSACTION; 

SET @rows_count = 0; 
SET @user_id = ...; 
SET @page_size = ...; 

SELECT 
    @rows_count := @rows_count + 1 AS RowNumber 
    ,CEIL(@rows_count/@page_size) AS PageNumber 
FROM ForumPost P 
WHERE 
    P.PosterId = @user_id; 

ROLLBACK; 
0

大多數SQL平臺,具有與表中的每個項目增加IDENTITY列或序列的專有擴展。大多數也有臨時表。

CREATE TABLE OF QUERY RESULTS WITH IDENTITY COLUMN 

INSERT INTO TABLE 
QUERY 
ORDER BY something 

然後,標識列是查詢中的數字,它會告訴您在它之前/之後有多少條目。

最重要的事情是什麼命令。否則,你可能會得到不同的訂單,在這種情況下你的電話號碼意味着什麼每個查詢...

相關問題