这看起来很简单。我有一个文章表,其中包含以下与此问题相关的字段:
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的每篇文章视为一个单独的类别。我怎么能这样做?
答案 0 :(得分:2)
您可以使用union
创建包含
然后从该表中选择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;