MySQL通过多个ID选择记录,每个ID使用LIMIT

时间:2015-03-25 13:27:22

标签: php arrays select mysqli

我坚持使用我的MySQLi查询。场景是这样的:    - 我需要为每个帖子选择最多10条评论。    - 我正在使用此查询,但它不能按我需要的方式工作    - 帖子ID在数组中

$comments_query = mysqli_query($con, "SELECT * FROM comments WHERE pid IN ({$decodedPostIds}) AND state='1' order by time LIMIT 10");
  • LIMIT 10适用于整体评论。

提前感谢所有建议和答案。 PS。我很抱歉我的英语。 彼得

1 个答案:

答案 0 :(得分:1)

LIMIT 10

表示结果将包含来自HOLE查询输出的10行。

让我们在数据库中说你有2个帖子:post1包含5个相关的评论,post2包含10个相关的评论。

执行查询: SELECT * FROM comments WHERE pid IN ({$decodedPostIds}) AND state='1' order by time

将返回:

  • post1:comment1
  • post1:comment2
  • post1:comment3
  • post1:comment4
  • post1:comment5
  • post2:comment1
  • post2:comment2
  • post2:comment3
  • post2:comment4
  • post2:comment5
  • post2:comment6
  • post2:comment7
  • post2:comment8
  • post2:comment9
  • post2:comment10

现在,将LIMIT 10添加到查询中,将返回孔结果的第1行,即从 post1:comment1 post2:comment5

你有2个解决方案:

  1. 为每个帖子制作一个循环并在该帖子上执行您的查询:

    SELECT * FROM comments WHERE pid = $ post_id AND state ='1'按时间顺序LIMIT 10

  2. 获取所有帖子,并使用PHP代码对每篇帖子的前10条评论进行分组

  3. 伪代码:

    $rows = mysqli_query($con,'SELECT * FROM comments WHERE WHERE pid IN ({$decodedPostIds}) AND state='1' order by time LIMIT 10');
    
    foreach($rows as $row){
        if(count($arr[$row['post_id']]) < 10){
            array_push($arr[$row['post_id']],$row)
        }
    }
    

    现在$ arr是一个数组,其中每个键都是post_id,第10个注释为值。

    IMO:我更喜欢解决方案2(讨厌在循环中执行查询)。

    希望它有所帮助。