0

我有文章,属于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)
4

1 回答 1

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 解决方案会很有趣。

于 2012-08-24T08:25:16.453 回答