我想以一种面向未来的方式来展示我的博客。因此,我需要进行查询,以在创建新博客类型时引用它们。因此,x列名称。在这种情况下,这是blogType。该选择查询应包含所有博客类型的博客信息,但是对于每种博客类型,将获得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';
因此,我已尽力实施该解决方案,但出现了一些错误。我不确定是否应该为此撰写新文章,但是上面的代码是我所使用的,这是我得到的错误:
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
答案 0 :(得分:2)
由于您的MySQL版本支持窗口功能,因此您可以使用ROW_NUMBER()
,它将按博客类型枚举您的条目。然后,您只需要选择每种类型的前三行即可。
SELECT *
FROM (
SELECT b.*, ROW_NUMBER() OVER (PARTITION BY b.type ORDER BY b.dateWritten DESC) as rn
FROM blogs b
) x
WHERE x.rn <= 3
ORDER BY x.type, x.dateWritten DESC -- adjust as needed
注意:
type
列确定。如有需要,进行调整。DESC
而不是ASC
,因为您要获取最新的条目。id
列而不是dateWritten
进行排序。这更可靠,因为DATE甚至TIMESTAMP都可以重复。对于不支持窗口功能的旧版本,我将首先获取所有类型并生成UNION ALL查询。使用PDO可能类似于以下内容:
$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
注1:即使执行了两个查询,给定(type, dateWritten)
上的复合索引,这仍然比其他解决方案要快。如果您有两种博客类型,并且每种类型都有很多文章,那么它甚至比ROW_NUMBER()解决方案还要快。
注2:通常,我将有一个单独的类型表,而blogs
表将引用主键type_id
列。在这种情况下,第一个查询将是SELECT type_id from blog_types
,子查询将具有条件WHERE type_id = ?
。