2011-02-12 17 views
0

ランダムにレコードを選択する必要がありますが、すべてのレコードが選択されていない限り、すでに選択されているレコードはありません。mysql random number least used

表セットアップ: _word(ID、NAM) _word_tm(ID、word_id、TM)

言葉が使用されるたびに_word_tmにロードされます。私がしたいことは、すでに使用されている単語を再利用する前に、すべての単語を使用することです。

私が実際に探しているのは、以下のようなものですが、メッシュの仕方を理解しようとしています。

LEFTワット_word中から選択w.namは、カウント(wt.id)ASC、ランド(BY _word_tm重量ON w.id = wt.word_id ORDERのJOIN)あなたが好きな何かを行うことができるはず1

+0

これをすべてSQL文でデータベースレベルで実行するか、中間層で行うことができますか? – rajeshnair

+0

制約はありません。私はPHP/MySQLを使用します。 – David

答えて

1

まず操作を行い、任意のreocrdを返さない場合

0

を制限これは:

SELECT * FROM word_table WHERE word NOT IN (SELECT word FROM words_used) ORDER BY rand() LIMIT 1; 

これが機能するには、更新されたコピーが必要です。また、word_tableと同じ内容を持っていたら、words_usedテーブルをクリア/リセットするために、後でまたは手前で一連のコードを追加する必要があります。上記回数以上見つける、簡単な

select A.nam 
from _word A 
order by rand() 
limit 1 
0

あなたはランダムな行を返すために、次のSQLを試すことができ

select A.nam 
from _word A 
where A.id not in (select B.id from _word_tm B) 
order by rand() 
limit 1 

select _word.id, count(*) c from _word 
left join _word_tm on _word.id=_word_tm.word_id order by c limit 1; 

変数($least_used)に値を格納します。それでは、何度も何度も何度も使用されている言葉をランダムな順序で取得してください:

select _word.id, count(*) c from _word 
left join _word_tm on _word.id=_word_tm.word_id 
group by _word.id having c <= {$least_used} 
order by rand() limit 1;