2012-07-29 105 views
0

感謝您的期待,我試圖從數據庫中隨機獲取20個條目並且是唯一的,因此同一個條目不會出現兩次。但我也有一個questionGroup字段,它也不應該出現兩次。我想讓這個字段不同,但是然後得到所選字段的ID。SQL Distinct - 獲取所有值

下面是我不工作的腳本,因爲它的ID爲不同過於其中

SELECT DISTINCT `questionGroup`,`id` 
FROM `questions` 
WHERE `area`='1' 
ORDER BY rand() LIMIT 20 

任何建議,非常感謝!

感謝

+0

你能給設置一些樣本數據和樣本的結果?從這個問題來看,你不清楚你究竟瞄準了什麼。 – Vitaliy 2012-07-29 17:59:23

回答

2

嘗試通過/不同的第一子查詢從事羣體:

select * 
from (select distinct `questionGroup`,`id` 
     from `questions` 
     where `area`='1' 
    ) qc 
order by rand() 
limit 20 

我明白了。 。 。你想要的是從每個組中選擇一個隨機行,然後將其限制爲20個組。這是一個更難的問題。我不確定您是否可以在mysql中使用單個查詢來準確執行此操作,而不使用變量或外部表。

下面是一個近似值:

select * 
from (select `questionGroup` 
      coalesce(max(case when rand()*num < 1 then id end), min(id)) as id 
     from `questions` q join 
      (select questionGroup, count(*) as num 
      from questions 
      group by questionGroup 
      ) qg 
      on qg.questionGroup = q.questionGroup 
     where `area`='1' 
     group by questionGroup 
    ) qc 
order by rand() 
limit 20 

這使用蘭特()來選擇一個id,同時,平均每兩個分組(但它是隨機的,所以有時0,1,2,等) 。它選擇這些的最大值()。如果沒有出現,那麼它會佔用最小的。

這會稍微偏離最大值(或最小值,如果您在等式中切換最小值和最大值)。對於大多數應用程序,我不確定這種偏見會造成很大的差異。在其他支持排名功能的數據庫中,您可以直接解決問題。

+0

不錯的概念,但它不會工作,因爲你從某個地方選擇了一切,只有你選擇了不同的組和ID。 ID不需要明確,因爲它然後查找ID和問題組不同,這是不可能的,因爲ID是唯一的。所以我只需要不同的問題組,但想要拉ID的結果 – DugoutSoccer 2012-07-29 17:40:59

0

像這樣的事情

SELECT DISTINCT * 
FROM (
    SELECT `questionGroup`,`id` 
    FROM `questions` 
    WHERE `area`='1' 
    ORDER BY rand() 
) As q 
LIMIT 20 
+0

我正在尋找的結果將需要像選擇不同('questionGroup'),'ID'但不幸你不能這樣做作爲查詢:( – DugoutSoccer 2012-07-29 17:44:40