Mysql SQL查询性能和联接表

Mysql SQL查询性能和联接表,mysql,sql,Mysql,Sql,我正在努力为我的问答网站获取最佳查询。作为一个简化示例,我有3个表(问题、答案和用户): 表格用户 UserID FirstName 1 John 2 Jack 3 Ana 4 Mary QuestionID fkUserID Title 1 4 What is...? 2 2 Where is...? 3 1 How to...? 4

我正在努力为我的问答网站获取最佳查询。作为一个简化示例,我有3个表(问题、答案和用户):

表格用户

UserID  FirstName
1       John
2       Jack
3       Ana
4       Mary
QuestionID  fkUserID Title
1           4        What is...?
2           2        Where is...?
3           1        How to...?
4           3        How much...?
AnswerID    fkQuestionID    fkUserID  Answer
1           1               3         It is...
2           2               1         It is located in ZZ...
3           2               4         It is located in YY...
4           3               2         You have to...
表格_问题

UserID  FirstName
1       John
2       Jack
3       Ana
4       Mary
QuestionID  fkUserID Title
1           4        What is...?
2           2        Where is...?
3           1        How to...?
4           3        How much...?
AnswerID    fkQuestionID    fkUserID  Answer
1           1               3         It is...
2           2               1         It is located in ZZ...
3           2               4         It is located in YY...
4           3               2         You have to...
表_答案

UserID  FirstName
1       John
2       Jack
3       Ana
4       Mary
QuestionID  fkUserID Title
1           4        What is...?
2           2        Where is...?
3           1        How to...?
4           3        How much...?
AnswerID    fkQuestionID    fkUserID  Answer
1           1               3         It is...
2           2               1         It is located in ZZ...
3           2               4         It is located in YY...
4           3               2         You have to...
我正在创建新闻源以:

  • 显示按添加日期排序的最后答案
  • 如果有两个 对于同一个问题的答案,新闻提要将只显示最后一个问题 回答(避免重复)。在本例中,新闻提要将仅显示应答ID 3(它位于YY…),并将跳过应答ID 2
  • 新闻提要将显示该用户的名字 创建问题的人和回答问题的人都位于同一个用户表中
  • 但是,到目前为止,我创建了以下查询:

    我遇到一些性能/速度问题,并且我无法仅显示问题的最后一个答案(问题2),在这种情况下,DISTINCT select无法按预期工作

    SELECT 
    DISTINCT (A.fkQuestionID) as QuestionID,
    Q.Title,
    A.AnswerID as AnswerID,
    A.Answer,
    U1.FirstName as AnswerFirstName,
    Q.pkQuestionID,
    U2.FirstName as QuestionFirstName
    
    FROM table_answers as A
    INNER JOIN table_questions as Q ON Q.QuestionID=A.fkQuestionID
    INNER JOIN table_users as U1 ON U1.UserID=A.fkUserID
    INNER JOIN table_users as U2 ON U2.UserID=Q.fkUserID
    ORDER BY A.AnswerID DESC
    
    我想返回预期结果,如下所示:

    QuestionID  AnswerID  AnswerFirstName   QuestionFirstName
    3           4         Jack              John
    2           3         Mary              Jack
    1           1         Ana               Mary
    
    欢迎任何帮助。提前谢谢

    请像这样试试

    SELECT  QuestionID ,fkUserID,title,ANS.Answer
    FROM    table_questions QST
    INNER JOIN (SELECT fkQuestionID,MAX(AnswerID) AnswerID
                FROM    table_answers
                GROUP BY fkQuestionID) ANS ON ANS.fkQuestionID = QST.QuestionID
    INNER JOIN table_answers LANS ON LANS.AnswerID = ANS.AnswerID
    

    您可以按
    fkQuestionID
    分组以获得
    max(AnswerID)
    ,然后像这样在进一步的
    join
    中使用它

    SELECT 
    q.QuestionID,
    q.Title,
    a1.AnswerID as AnswerID,
    a1.Answer,
    U1.FirstName as AnswerFirstName,
    q.pkQuestionID,
    U2.FirstName as QuestionFirstName
    FROM
    (SELECT MAX(AnswerID) as AnswerID,fkQuestionID FROM table_answers GROUP BY fkQuestionID ) as a2
    INNER JOIN table_answers a1  ON a1.fkQuestionID = a2.fkQuestionID AND a1.AnswerID = a2.AnswerID
    INNER JOIN table_questions q ON q.QuestionID = a2.fkQuestionID 
    INNER JOIN table_users as U1 ON U1.UserID=a1.fkUserID
    INNER JOIN table_users as U2 ON U2.UserID=q.fkUserID
    ORDER BY a2.AnswerID DESC
    

    您可以在子查询中使用
    MAX
    ,并执行
    JOIN
    s以获取所需的列:


    如果您希望包含没有答案的问题,请将
    内部连接
    替换为
    左连接

    SQL Server或MySQL?@FelixPamittan这是MySQLtks的一大特色!是否可以创建一个查询,以便也包括没有答案的问题,并按所有最近的活动对所有内容进行排序?
    group by
    查询将是
    left-outer-join
    ,以及
    table\u-answers
    。由于没有共同的时间,我不确定我们如何定义一个最近的问题或一个不同问题的答案是否是最近的,因为不同表中的ID不同,并且任何一个表中都没有日期!如果两个表(表_问题和表_答案)都有一个时间戳列怎么办?您可以按顺序使用
    magest(q.timestamp,a.timestamp)DESC