我正在研究论坛系统。我试图让用户看到他们发布的帖子。为了使这个链接起作用,我需要跳转到他们发布的包含帖子的特定主题的页面,以便书签可以正常工作,等等。因为这是一个新功能在一个旧的论坛上,我想对它进行编码,以便论坛系统不必跟踪每个帖子,但可以自动填充此列表。
我知道如何填充列表,但我需要这样做:
在给定查询的情况下,查询中的X行(由某些标识符组合保证是唯一的)会出现在哪里?就像在,我需要偏移多少行才能达到它?这将是一个排序查询。
理想情况下,我想用SQL而不是PHP来做这件事,但如果不能在SQL中完成,我想这也是一个答案。 ^ _ ^
由于
答案 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
然后标识列是查询中的数字,它会告诉您之前/之后有多少条目。
重要的是按顺序排序。否则,您可能会针对每个查询获得不同的订单,在这种情况下,您的号码不代表什么......