0

ご覧いただきありがとうございます。データベースからランダムかつ一意に20個のエントリを取得しようとしているため、同じエントリが2回表示されることはありません。しかし、questionGroupフィールドもあります。これも2回表示されるべきではありません。そのフィールドを区別したいのですが、選択したフィールドのIDを取得します。

以下は私のNOTWORKINGスクリプトです。これは、IDも区別できるためです。

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

どんなアドバイスも大歓迎です!

ありがとう

4

2 に答える 2

2

サブクエリで最初にgroupby/distinctを実行してみてください。

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

これは、rand()を使用してIDを選択し、グループごとに平均2つを取得します(ただし、ランダムであるため、0、1、2などの場合もあります)。これらのmax()を選択します。何も表示されない場合は、最小値を取ります。

これは、最大ID(または、方程式の最小値と最大値を切り替える場合は最小値)からわずかにバイアスされます。ほとんどのアプリケーションでは、このバイアスが大きな違いを生むかどうかはわかりません。ランキング機能をサポートする他のデータベースでは、問題を直接解決できます。

于 2012-07-29T17:37:13.100 に答える
0

このようなもの

SELECT DISTINCT *
FROM (
    SELECT `questionGroup`,`id` 
    FROM `questions`
    WHERE `area`='1' 
    ORDER BY rand()
) As q
LIMIT 20
于 2012-07-29T17:39:52.380 に答える