有没有办法通过遍历整个集合来了解查询结果中特定项目的顺序?
我有一个以Ajaxified方式显示用户评论的Web应用程序,我想向用户发送他们的评论链接,如下所示:
http://my.web/post/12345#comment_45
并使用哈希值“comment_45”加载带有给定注释的注释页面,但我不知道如何通过遍历整个结果获得正确的页面。
谢谢
答案 0 :(得分:1)
我不知道这个URL的生成方式和位置,但我会假设如果你知道在创建URL时它是哪个注释,你应该知道以后的时间和日期。听起来每个评论都有一个唯一的ID(如果没有,则应该这样)。
我不认为让comment_45引用特定页面上的某个评论是一种可靠的方式来稍后检索该评论(如果页面前面或其他页面上的其他评论被删除该怎么办?如果您更改了多少评论该怎么办?在页面上显示?等等)
如果注释有ID,并且URL中的“comment_45”实际上是此ID,则可以使用以下常规SQL查询来仅检索此注释:
select field1, field2, ... fieldn from comments where comment_id = id;
在这种情况下,id
将是一个变量,其中URL提供了注释ID(comment_45的“45”部分)。由于此信息来自不受信任的来源(互联网),因此您需要确保清理输入以防止SQL注入。
答案 1 :(得分:0)
您的评论是否以合理的方式排序?如果它们总是按照从头到尾(或从最后到第一个)的数字顺序显示,您应该能够根据知道a)评论总数,b)每页的评论数量来计算它所在的页面。
答案 2 :(得分:0)
根据定义,SQL数据库中的行是无序的。为了保证后续查询的顺序相同,您必须包含“order by”子句。然后,您可以使用以下查询执行所需操作
SELECT * FROM `your_table` ORDER BY `date_entered` LIMIT 45, 1
如果在查询之间插入或删除行,则结果将不是用户期望的结果,但如果order-by字段是日期时间,则通常不会出现问题。
答案 3 :(得分:0)
我经常反对在MySQL中使用存储过程,因为我认为它们还不够成熟,但我认为这是创建一个的经典案例。
我们仍然需要有两个查询,一个用于获取评论的顺序,另一个用于获取相关行,但由于必须知道LIMIT值,因此无法找到任何更有创意的查询在1个单个查询中完成在执行查询之前。
如果我们不讨论巨大的结果集,那么简单地获取所有结果和注释顺序然后使用array_slice仅显示相关页面注释可能更有效。
/* get the comment order */
SET @commentOrder = 0;
SELECT commentOrder INTO @relevantCommentOrder FROM (
SELECT commentID, @commentOrder := @commentOrder+ 1 as commentOrder
FROM COMMENTS
ORDER BY creationDate) commentsOrder
WHERE commentID= 45;
/* get the value we want to use in the LIMIT clause */
SET @startFrom = CONVERT(ROUND(ROUND(@relevantCommentOrder/10)*10) ,UNSIGNED);
/* fetch relevant results */
PREPARE STMT FROM 'SELECT * FROM COMMENTS LIMIT ?,10';
EXECUTE STMT USING @startFrom;
下一个是1个查询,可以获得整个结果集并将注释的顺序放在所有行中,这样您就可以检查PHP中第一行的relatedCommentOrder字段,然后对数组进行切片因此它只显示相关的评论,只有在整个结果集不太大的情况下,这个评论才有效。
SET @commentOrder = 0;
SELECT *, @relevantCommentOrder;
FROM (
SELECT commentID, @commentOrder := @commentOrder+ 1 as commentOrder,
@relevantCommentOrder := case when commentID = 45
then @commentOrder
else @relevantCommentOrder end
FROM COMMENTS
ORDER BY creationDate ) subQuery;