Mysql查询拉出最新的行而不显示具有相同id的其他行

时间:2013-03-30 21:41:16

标签: mysql

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

我有三张桌子:

  • 会员(ID,姓名,公司)
  • 问题(ID,问题)
  • questionanswerxref(ID,用户ID,questionid,回答)

当成员回答预先定义的问题时,会将其插入到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次,则会显示每个问题。我只想要他们提交的最后一个答案。

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

1 个答案:

答案 0 :(得分: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