0

我需要一些有关 mysql 查询的帮助。

我有三张桌子:

  • 成员(ID、姓名、公司)
  • 问题(id,问题)
  • questionanswerxref(id,userid,questionid,answer)

当成员回答预定义的问题时,它被插入到 questionanswerxref 表中。随着情况的变化和时间的推移,他们最终会多次回答相同的问题。我需要运行一个查询,该查询将为我提供每个问题和特定成员的最新答案(我根据登录者添加 memberid)。

到目前为止,我有以下内容,但我已经尝试了它的几个变体如果他们没有回答问题,我也想在没有答案的情况下显示它。

SELECT MAX( qq.id ) , coalesce( qq.answer, '' ) AS answer, q.question
FROM `questionanswerxref` qq
LEFT JOIN questions q ON q.id = qq.questionid
WHERE qq.userid = ".mysql_real_escape_string($userid)."
GROUP BY qq.id,q.id
ORDER BY q.id"

另一个版本是..

select q.id,q.question, coalesce(qq.answer,'') as answer from questions q
left join questionanswerxref qq on q.id = qq.questionid AND qq.userid = ".mysql_real_escape_string($userid)."
group by q.id,qq.id

我不断收到很多问题。因此,如果他们回答相同的问题 4 次,则会显示每个问题。我只想要他们提交的最后一个答案。

似乎应该很容易,但我很难过。

4

1 回答 1

0

您的查询的一个问题是您按 questionanswerxref.id 分组,因此实际上根本没有分组,因为 id 可能是该表中的主键。

另一个问题是您选择的字段既不是聚合函数也不是子句中提及的group by字段,这会给出不确定的结果或错误,具体取决于 dbms。

假设您想要每个用户和答案具有最高 id 的答案,您可以使用按 userid 和 questionid 分组的子查询来查找最新答案的 id,然后将其加入问题和答案:

SELECT q.id, q.question, coalesce(qq.answer,'') as answer
FROM questions AS q
LEFT JOIN 
    (SELECT userid, questionid, MAX(id) AS maxid
     FROM questionanswerxref
     GROUP BY userid, questionid) AS maxids  -- find latest answerid 
ON maxids.questionid = q.id
LEFT JOIN questionanswerxref AS qq           -- then join to answer
on qq.id = maxids.maxid
WHERE qq.userid = :userid
ORDER BY q.id
于 2013-03-30T22:20:24.750 回答