PHP文件中的SQL查询需要修复

我问了一个类似的问题,但是不能完全得到查询给我想要的结果,它输出一个问题,但不是正确的。 我会在这里澄清一下这个问题并稍微修改一下表格。 我有一个程序,如果一个人输入“让我们说话”,该程序会向用户询问表中的一些问题,(例如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.' 

(*问题表最初可以为空白)

基本上,该程序获得了一个用户’$ name’的第一个问题,该问题不在questionsasked表中。 然后询问问题并将问题的答案添加到问题表中。 (起初我试图找到正确的问题)

一个javascript / jQuery的片段去与php的接口如下:

  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 { ?>alert('$name');  

我几乎可以工作了,但是当我在问题表中添加答案并刷新并说“让我们说话”时,它回过头来问同样的问题。 然后我稍微更改了代码,现在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'"; 

您可能需要考虑阅读左连接的工作原理

尝试这样的事情:

 "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 DBvalidation了它:-)由于左连接中的missin PID,以前的版本不起作用!

问候,

马丁