我有属于article_types的文章,属于类别。每篇文章都有一种格式。
我想列出特定作者发布的所有文章,按类别分组。
我想展示所有类别,甚至是没有文章的类别。
所有文章都有article_type,所有类别都包含文章类型。
我的查询在MySQL 5.5.x上完美运行,但在5.0上没有。这是一个MySQL错误,还是应该更改查询或两者兼而有之?
SELECT
a.article_id, a.article_time, a.article_notes f.format_name, at.article_type_name, c.category_name, c.category_description
FROM
article AS a
LEFT JOIN article_type AS at ON at.advice_id = a.advice_id
LEFT JOIN format AS f ON f.format_id = a.format_id
RIGHT JOIN category AS c ON c.category_id = at.cateory_id
WHERE
(a.author_id = 5 AND a.published = 1)
OR (a.author_id IS NULL)
ORDER BY
c.category_name ASC, a.article_time DESC
期望的输出(在简单的php循环之后):
Category 1
Article A (Article Type I) (Digital)
Article B (Article Type I) (Print)
Article E (Article Type II) (Digital)
Category 2
Category 3
Article H (Article Type V) (Audio)
Article M (Article Type IV) (Print)
答案 0 :(得分:0)
由于WHERE子句的这一部分,无法实现具有多个作者的完整类别列表:
OR (a.author_id IS NULL)
我必须将其删除并包含第二个查询以检索完整的类别列表。
然后我使用PHP(或类似的)循环遍历每个类别并在该循环中循环遍历每篇文章,创建一个新的数组/对象,包含该特定作者的所有类别和文章:
if(is_array($categories)) {
if(is_array($articles)) {
foreach($categories as $ck => $cv) {
$category_set = false;
foreach($article as $ak => $av) {
if($av['category_name'] == $cv['category_name']) {
$articles_by_category[] = $article[$ak];
$category_set = true;
unset($article[$ak]);
}
}
if($category_set == false) {
$articles_by_category[] = $categories[$ck];
}
}
$articles = $articles_by_category;
unset($articles_by_category);
} else {
$articles = $categories;
}
}
看看是否有人拥有纯粹的MySQL解决方案会很有趣。