2016-02-05 45 views
2

這似乎很容易做到。我的文章的表有相關與這個問題了以下字段:從不同類別中選擇物品,包括沒有類別的物品

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都看作是一個單獨的類別。我怎樣才能做到這一點?

回答

2

您可以使用union創建一個包含每個非

  1. 1文章編號派生表-1類
  2. 爲-1
  3. 類別的所有文章IDS

,然後選擇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; 

正如在comme中指出的nts,上面的查詢可能會返回每個類別ID相同的文章ID。如果這是一個問題,您可以嘗試下面的查詢,但它可能會運行緩慢,因爲它通過rand()兩次排序表。

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; 
+1

按類別分組的子查詢可能不是非常隨機的。選擇是任意的,但是如果表沒有改變,那麼從一個查詢到下一個查詢可能是一致的。 – Barmar

+0

@Barmar的確如此。我認爲使查詢真正隨機,但決定反對它,因爲它似乎這個查詢已經很昂貴,因爲它是。 – FuzzyTree

相關問題