0

我有这三张桌子

people
============
id, name

,

surveys
============
id, org_id

answer_sheets
============
id, person_id, survey_id, answer, date_answered
  • person_idand是来自andsurvey_id的外键people.idsurveys.id

现在,我想做的是people根据最新的排序answer_sheets.date_answered(我们可以得出一个surveysANDpeople行可以有很多answer_sheets)给定surveys.org_id

比如说我们有桌子

people  
============
id  name  
1   Person1  
2   Person2  
3   Person3  
4   Person4  
5   Person5  

surveys
============
id  org_id  
1   1  
2   1
3   2
4   2


answer_sheets  
=============
id  person_id   survey_id   answer  date_answered  
1   1           1           string  JUN 13  
2   2           1           string  JUN 15  
3   3           2           string  JUN 17  
4   2           2           string  JUN 18  
5   1           2           string  JUN 19  
6   3           3           string  JUN 20  
7   2           3           string  JUN 25  
8   4           3           string  JUN 27  
9   4           4           string  JUN 27

我想根据一行最新的调查people按顺序订购= 1ASCpeopleanswer_sheets.date_answeredorg_id

输出将是

=============
id  name      last_date_answered
4   Person4   NIL
5   Person5   NIL
3   Person3   JUN 17
2   Person2   JUN 18
1   Person1   JUN 19

您可以观察到peoplewith ids 4 和 5 没有answer_sheetin surveyswith org_id= 1 ,但它们应该包含在列表中。问题:什么必须是适当的 SQL 查询?谢谢。

4

3 回答 3

1

这个查询更简单:

SELECT
    p.id,
    p.name,
    t.last_date_answered
FROM people p
LEFT JOIN (
    SELECT
        a.person_id,
        MAX(a.date_answered) as last_date_answered
    FROM answer_sheets a
    INNER JOIN surveys s ON a.survey_id = s.id
    WHERE s.org_id = 1
    GROUP BY a.person_id) t ON p.id = t.person_id
ORDER BY t.last_date_answered;

UNION也很强大,但这里不LEFT JOIN那么冗长。

于 2012-06-27T07:35:26.603 回答
1

此查询仍然有效,但其他答案更好。小提琴仍然有效

http://sqlfiddle.com/#!2/3aac2/1/0

这是我在这个夜晚能做的最好的事情。是的,它很丑(非常非常丑),但它提供了所需的输出。我真的不喜欢我必须使用一个 union 和 an in,但是现在是深夜,所以我可能错过了一些东西。请注意,如果这是 /is/ 作业,您可能希望远离此解决方案。如果不是,底部有一个小提琴可以帮助其他人帮助你

SELECT people.id,
   people.name,
   MAX(date_answered) AS date_answered
FROM people
LEFT OUTER JOIN answer_sheets ON answer_sheets.person_id = people.id
INNER JOIN surveys ON surveys.id = answer_sheets.survey_id
GROUP BY people.id,
     surveys.org_id HAVING surveys.org_id = 1
UNION
SELECT ALL people.id,
       people.name,
       NULL AS date_answered
FROM people
WHERE people.id NOT IN
    (SELECT person_id
     FROM answer_sheets
     INNER JOIN surveys ON answer_sheets.survey_id = surveys.id
     WHERE surveys.org_id = 1)
ORDER BY date_answered

使用以下解决方案之一,在子查询上左连接更好。小提琴仍然有效

如果有人想对此进行改进,请随时使用这个小提琴: http ://sqlfiddle.com/#!2/3aac2/1/0

于 2012-06-27T05:40:56.783 回答
0
SELECT
  p.id, p.name, MAX(a.date_answered)
FROM
  people p
LEFT JOIN
  (SELECT * FROM 
    answer_sheets a
  INNER JOIN
    surveys S ON a.survey_id = s.id
  WHERE S.orgid = 1) a
ON
  p.id = a.personID
GROUP BY
  p.id, p.name
ORDER BY MAX(date_answered) ASC

这是最优化的答案。感谢我的朋友 Sheila Ruth Fausto。

于 2012-06-27T13:13:10.467 回答