1

同様の質問をしましたが、クエリを取得して必要な結果を得ることができませんでした。質問は出力されましたが、正しいものではありませんでした。ここで質問をもう少し明確にし、表を少し修正します。私は、人が「話をしましょう」と入力すると、プログラムがユーザーにテーブルからいくつかの質問をするプログラムを持っています(例: 20 qns)

私は3つのテーブルを持っています。

   (peopleiknow)           (questions)              (questionsasked)    
    NID    FName            QID   Question             QID PID Answer

     1      Mark             1   Are you human          1    1 'Definately yes.'
     2      Sue              2   Do you like soup?      1    2 'Most of the time.'
                                                        2    2 'Yes especially tomato.'

(※出題表は最初は空欄でも構いません)

基本的に、プログラムは、questionsasked テーブルにないユーザー '$name' の最初の質問を取得します。次に、質問をし、その回答を questionasked テーブルに追加します。(最初は正しい質問を得ようとしています)

PHP とのインターフェイスに移動するための javascript/jQuery のスニペットは次のとおりです。

    var uname='Lindsay';  //will be assigned dynamically after I get this fixed.  
 $.post('ajax/getQuestions.php', { name: uname },function(data2) {
   var qn = data2.value1; //question
   var pid = data2.value2; // PID
   var qid = data2.value3;  //QID
   alert(qn);
   alert(pid);
   alert(qid);
 var answer1 = prompt(qn, 'Please answer here');
 $.post('ajax/addQuestionAsked.php', {answer: answer1, PID: pid, QID: qid},
       function(data3) {alert('added question');} );


  //$('div#PlaceOfResponse').html(data3);}

  });

PHP ファイルの重要な部分は次のとおりです。

コネクション部分省略 ※ $linkはコネクション

 if (isset($_POST['name']) && !empty($_POST['name'])) 
 {
    $name = trim($_POST['name']); //could do better protection..

  $query1 = "SELECT *      //(q.Question, q.QID, p.person)?                         
  FROM questions q
  INNER JOIN questionsasked qa 
  ON q.QID = qa.QID 
  INNER JOIN peopleiknow p
  ON qa.PID = p.NID
  WHERE qa.Asked='N' OR qa.Asked IS NULL
  AND p.Person = '$name'"; 

上記のクエリはうまく機能せず、以下のコメントで試してみましたが、うまくいきませんでした..

/*
         $query1 = "SELECT FIRST(Question)
                    FROM questions q
                    WHERE NOT EXISTS
                      (SELECT * 
                       FROM questionsasked qa
           RIGHT JOIN peopleiknow p
                       ON p.NID = qa.PID
                       INNER JOIN questions q
                        ON qa.QID = q.QID
                        WHERE q.QID = qa.QID
                        AND p.FName = '$name')";                  
        */


  if ($result = mysqli_query($link, $query1)) 
  {
      if (0 == mysqli_num_rows($result)) 
  {
       echo('all asked');
   }
  else
   {
     /* fetch associative array */
       $row = mysqli_fetch_assoc($result);
     {header('Content-Type: application/json');
    $question = $row['Question'];
    $PID = $row['PID'];  
    $QID = $row['QID'];
        $response = array('value1' => $question, 'value2' => $QID, 'value3' => $PID);
          echo json_encode($response);
         }
     }  
 }
 }

 else {
 ?><script>alert('$name');</script>
<?php
echo 'variable \'name\' not set properly';}
 /* close connection */
 mysqli_close($link);

 ?>

ほとんど機能していましたが、質問されたテーブルに回答を追加し、更新して「話しましょう」と言ったときに、戻って同じ質問をしました。次に、コードを少し変更したところ、js ファイルのアラートは、送り返された 3 つの変数すべてに対して (未定義) アラートを出すようになりました.. (テーブルを少し変更する前は機能していました)。なぜそれをしているのか、今ではわかりません。

これはクエリでの私の最新の試みです:

  $query1 = "SELECT FIRST(q.question,p.NID,q.QID)                               
  FROM questions q
  LEFT JOIN questionsasked qa 
  ON q.QID = qa.QID 
  LEFT JOIN peopleiknow p
  ON qa.PID = p.NID
  WHERE qa.QID
  NOT IN (SELECT * FROM questionsasked WHERE q.QID = qa.QID) 
  AND p.FName = '$name'";
4

1 に答える 1

1

左結合がどのように機能するかを読むことを検討することをお勧めします

このようなことを試してください:

"SELECT *      
  FROM questions q
  LEFT JOIN questionsasked qa 
  ON   q.QID = qa.QID 
   and qa.PID = (select NID from peopleiknow where FName = '$name')
  WHERE qa.PID IS NULL "

今回は SQLite DB で検証しました :-) 以前のバージョンは、Left Join のミスイン PID のために機能しませんでした!

ご挨拶、

マーティン

于 2013-01-11T11:55:49.077 に答える