Php MySQL:如何在每个不同的x列名称中只选择三个

Php MySQL:如何在每个不同的x列名称中只选择三个,php,mysql,limit-per-group,Php,Mysql,Limit Per Group,我想以一种非常适合未来的方式展示我的博客。所以我需要做一个查询,如果创建了新的博客类型,它将引用这些类型。因此,x列的名称。在这种情况下,这是博客类型。此select查询应包含所有博客类型的博客信息,但对于每个博客类型,应获取3个博客。这有点让人困惑,所以这就是我重申的原因 我已经在谷歌上做了一些工作来限制搜索结果。如下所示: $query = 'SELECT * FROM blogs ORDER BY dateWritten ASC L

我想以一种非常适合未来的方式展示我的博客。所以我需要做一个查询,如果创建了新的博客类型,它将引用这些类型。因此,x列的名称。在这种情况下,这是博客类型。此select查询应包含所有博客类型的博客信息,但对于每个博客类型,应获取3个博客。这有点让人困惑,所以这就是我重申的原因

我已经在谷歌上做了一些工作来限制搜索结果。如下所示:

 $query = 'SELECT * FROM blogs
              ORDER BY dateWritten
              ASC LIMIT 3';
我将使用数组和foreach循环将结果输出到blog_rss.php。我从如下函数中获取数组:

function get_Recent_Blogs() {
    global $db;
    $query = 'SELECT * FROM blogs
              ORDER BY dateWritten
              ASC LIMIT 3';
    try {
        $statement = $db->prepare($query);
        $statement->execute();
        $result = $statement->fetchAll(PDO::FETCH_ASSOC);
        $statement->closeCursor();
        return $result;
    } catch (PDOException $e) {
        $error_message = $e->getMessage();
        display_db_error($error_message);
    }
}
这不太重要,但至少能给你一些背景知识

    SELECT *
    FROM (
         SELECT b.*, ROW_NUMBER() OVER (PARTITION BY b.blogType ORDER BY b.blogID DESC) as rn
         FROM blogs b
         ) x
    WHERE x.rn <= 3
    ORDER BY x.blogType, x.blogID DESC';

由于您的MySQL版本支持窗口函数,所以您可以使用ROW_NUMBER,它将按博客类型枚举您的条目。然后,您只需要选择每种类型的前三行

挑选* 从…起 选择b.*,按b.type按b.ORDER按b.datewrited描述为rn的分区上的行号 来自博客b x
WHERE x.rn您的MySQL版本是什么?8.0.13是我的版本,让我们澄清一下:您需要一个查询,每个博客类型返回三篇最新文章。对吗?完全正确。对非常感谢。我是MySQL的新手,所以这很有帮助。我很感激!你不会碰巧知道这里的语法有什么问题吧?@DanielJ.Dunevant你有错误吗?这对我来说很有用:我做了…:在测试5.7中有效的代码时,我得到了以下错误:SQLSTATE[HY093]:无效参数编号:未绑定任何参数。fiddle代码是针对8.0的,但目前它对我不起作用。@DanielJ.Dunevant您编写的版本是8.0.13,但关于近分区的错误告诉我它不起作用。然而,这就是为什么我写了第二个解决方案。没有绑定任何参数-似乎您已更改了某些内容。确保在此处传递类型:$statement->execute$types;
You have an error in your SQL syntax; it seems the error is around: '( PARTITION BY b.blogType ORDER BY b.dateWritten DESC ' at line 7
$types = $db
       ->query('SELECT DISTINCT type from blogs ORDER BY type')
       ->fetchAll(PDO::FETCH_COLUMN);

$subqueries = array_map(function($type){
    return '(SELECT * FROM blogs WHERE type = ? ORDER by dateWritten DESC LIMIT 3)';
}, $types);

$query = implode(' UNION ALL ', $subqueries) . ' ORDER BY type, dateWritten DESC';

$statement = $db->prepare($query);
$statement->execute($types);
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
(SELECT * FROM blogs WHERE type = ? ORDER by dateWritten DESC LIMIT 3)
UNION ALL
...
UNION ALL
(SELECT * FROM blogs WHERE type = ? ORDER by dateWritten DESC LIMIT 3)
ORDER BY type, dateWritten DESC