从不同类别中选择项目,包括没有类别

时间:2016-02-05 20:07:52

标签: mysql sql

这看起来很简单。我有一个文章表,其中包含以下与此问题相关的字段:

id - INTEGER(11) AUTO_INCREMENT
category_id - INTEGER(11) DEFAULT(-1)

当文章有类别时,其ID会出现在category_id字段中。如果没有类别,则列的值为-1。

我想要做的是从这篇文章表中选择三篇不同类别的随机文章。仅此一点非常简单:

SELECT id FROM articles GROUP BY category_id ORDER BY RAND() LIMIT 3; 

但是,我不想将没有类别的文章分组到一个类别中,就像之前的查询一样。也就是说,我想将category_id为-1的每篇文章视为一个单独的类别。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

您可以使用union创建包含

的派生表
  1. 每非类别1篇文章ID
  2. -1类别的所有文章ID
  3. 然后从该表中选择3个随机ID

    select id from (
        select id from articles
        where category_id <> -1
        group by category_id
        union all
        select id from articles
        where category_id = -1
    ) t order by rand() limit 3;
    

    正如评论中所指出的,上面的查询可能会返回每个类别ID相同的文章ID。如果这是一个问题,您可以尝试下面的查询,但它可能会运行缓慢,因为它按兰德()两次对表进行排序。

    select id from (
        select id from (
            select id from articles
            where category_id <> -1
            order by rand()
        ) t 
        group by category_id
        union all
        select id from articles
        where category_id = -1
    ) t order by rand() limit 3;