0

これが私の問題です...一部のユーザーにとって単純すぎる場合は申し訳ありませんが、私はこれが初心者です。

People (idPerson)、Question (idQuestion、Answer)、AskedQuestions (idPerson、idQuestion)の 3 つの DB テーブルがあります。ユーザーに質問するときは、AskedQuestions に行を追加して、レジストリを取得できるようにします。

私が抱えている問題は、特定のユーザーに対して以前に尋ねられなかったランダムな質問を選択する必要があることです。

ランダムな行を選択する最良の方法と、要求された行のみを選択するクエリを作成する方法を何時間も読んできましたが、それらをどのように混合できるかわかりませんでした。

PHP と MySqlで、どうすればそれができるか知っている人はいますか? とても大切にします。事前にコミュニティに感謝します。私の英語で申し訳ありませんが、私の英語力は最高ではありません!

ご挨拶

編集

私はあなた全員に投票しようとしましたが、rep15 になるまではできません、あははは...読んでいたときに、RAND() を使用するとテーブルの完全なスキャンが行われることを忘れていました。テーブルが 500000 件のレコードについての非常に大きな Question であり、AskedQuestions が 1500000 件またはそれ以上であるため、このケースは受け入れられません...したがって、RAND を実行するのにかかる時間は遅すぎます...

私は...のようなものが必要です...質問と尋ねられた質問に参加し、idUserがセッションユーザーと等しいものとidQuestion == idAskedQuestion...を除外し、そこからランダムなものを選択しますか?

それを行う方法はありますか?その場合、恐ろしく遅くなりますか??

4

7 に答える 7

2
$res=mysql_query("select count(*) as number from question where idquestion not 
in(select idquestion from askedquestion where idperson='".$_session['id']."')");
$row=mysql_fetch_assoc($res);
$num=$row['number'];
//$num has no. of rows

$final_query="select * from question where idquestion 
not in(select idquestion from askedquestion 
where idperson='".$_session['id']."') limit ".rand(0,$num).",1";

別の質問を選択します

于 2012-05-18T06:58:41.870 に答える
1

ランダムな質問を選択:

select * from question order by rand() limit 1

以前に聞かれたことのない質問を選択してください:

select * from question where idQuestion not in (select idQuestion from AskedQuestions)

結合:

select * from question 
where idQuestion not in (select idQuestion from AskedQuestions)
order by rand() 
limit 1
于 2012-05-18T06:57:42.273 に答える
0

ORDER BY RAND()ランダムな行を選択して、NOT IN質問されていない質問のみを照合しようとしましたか? 何かのようなもの:

SELECT q.idQuestion
FROM 質問q
WHERE q.idQuestion NOT IN (AskedQuestions aq WHERE aq.idPerson = 1 から aq.idQuestion を選択)
RAND()で並べ替え

明らかに、1 を適切な値 (おそらく PHP 変数) に置き換えます。

于 2012-05-18T06:59:02.937 に答える
0

以下のクエリを試してください

SELECT * FROM `Question` AS qs WHERE qs.idQuestion not in(SELECT aq.idQuestion FROM  
   AskedQuestions` AS aq WHERE aq.idPerson = loggedinUserID) ORDER BY RAND() LIMIT 0,1

クエリで rand() を使用したくない場合は、1 つの方法があります。

   /*Select max and min id*/
   $range_result = mysql_query( " SELECT MAX(`idQuestion `) AS max_id , MIN(`idQuestion `) AS 
   min_id FROM `Question` ");

    $range_row = mysql_fetch_object( $range_result );

    $random = mt_rand( $range_row->min_id , $range_row->max_id );

   $result = mysql_query( " SELECT * FROM `Question` AS qs  WHERE qs.`idQuestion` >= $random  
    AND qs.idQuestion not in (SELECT aq.idQuestion From ASkedQuestions AS aq where  
    aq.idPerson   = loggedInUSerID) LIMIT 0,1 "); 

お役に立てば幸いです。

ありがとう

ありがとう

于 2012-05-18T07:04:58.153 に答える
0

これまでに何をしましたか?

あなたはこれを試すことができます:

SELECT * Question q LEFT JOIN AskedQuestions a ON a.idQuestion = q.idQuestion WHERE a.idQuestion is null AND a.id AND a.idperson = 2 ORDER BY RAND() LIMIT 1;
于 2012-05-18T07:06:17.003 に答える
0

ランダムな行を効率的に選択する方法について調査しました。結果はこちら

あなたの場合、あなたは持っていますAUTO_INCREMENTか?その場合は、「ケース: ギャップのある AUTO_INCREMENT、1 行が返される」がニーズを満たすかどうかを確認してください。WHERE不要な質問を除外する句は、「ギャップ」につながることに注意してください。

そうでない場合は、FLOAT または UUID のアプローチを検討してください。どちらもうまくいくはずですが、おそらくこの「ランダムな」目的のために列が必要です。

于 2016-08-05T20:13:34.560 に答える
0

試す:

SELECT * FROM Question, AskedQuestions WHERE AskedQuestions.idQuestion != Question.idQuestion AND AskedQuestions.idPerson = 'PERSON_ID' LIMIT 1
于 2012-05-18T07:01:18.043 に答える