嘗試通過/不同的第一子查詢從事羣體:
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,等) 。它選擇這些的最大值()。如果沒有出現,那麼它會佔用最小的。
這會稍微偏離最大值(或最小值,如果您在等式中切換最小值和最大值)。對於大多數應用程序,我不確定這種偏見會造成很大的差異。在其他支持排名功能的數據庫中,您可以直接解決問題。
你能給設置一些樣本數據和樣本的結果?從這個問題來看,你不清楚你究竟瞄準了什麼。 – Vitaliy 2012-07-29 17:59:23