SQL - 在查询中查找特定行的位置

时间:2008-10-17 17:35:51

标签: php sql

我正在研究论坛系统。我试图让用户看到他们发布的帖子。为了使这个链接起作用,我需要跳转到他们发布的包含帖子的特定主题的页面,以便书签可以正常工作,等等。因为这是一个新功能在一个旧的论坛上,我想对它进行编码,以便论坛系统不必跟踪每个帖子,但可以自动填充此列表。

我知道如何填充列表,但我需要这样做:

在给定查询的情况下,查询中的X行(由某些标识符组合保证是唯一的)会出现在哪里?就像在,我需要偏移多少行才能达到它?这将是一个排序查询。

理想情况下,我想用SQL而不是PHP来做这件事,但如果不能在SQL中完成,我想这也是一个答案。 ^ _ ^

由于

7 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

如果您正在使用MSSQL,则可以使用ROW_NUMBER()函数向查询中的每一行添加自动递增数字。

我不知道你会有什么好处。但它会按照您的要求执行操作 - 为给定查询的结果集中的行位置指定一个数字。

如果这是用ph写的,你可能正在使用mySQL。

答案 2 :(得分:0)

关于数据库的事情是它们没有真正的“秩序”。您可以使用SCOPE_IDENTITY运算符返回插入记录的唯一ID,然后编写某种函数进行分页,直到找到该记录。

答案 3 :(得分:0)

扩展Troy的建议,你需要一个子查询,基本上,

 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计算页码。

答案 4 :(得分:0)

我同意Troy,你可能会错误地解决这个问题,修复它我们必须知道更多细节,但无论如何在MySQL中你都可以这样做

SET @i=0;
SELECT number FROM (SELECT *,@i:=@i+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>

答案 5 :(得分: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;

答案 6 :(得分:0)

大多数SQL平台都具有IDENTITY列或序列的专有扩展,这些列或序列随表中的每个项目递增。大多数人也有临时表。

CREATE TABLE OF QUERY RESULTS WITH IDENTITY COLUMN

INSERT INTO TABLE  
QUERY  
ORDER BY something

然后标识列是查询中的数字,它会告诉您之前/之后有多少条目。

重要的是按顺序排序。否则,您可能会针对每个查询获得不同的订单,在这种情况下,您的号码不代表什么......