1

私はこれらの2つのテーブルを持っています

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

answer_sheets
============
id, person_id, answer, date_answered
  • person_idpeople.id からの外部キーです

今、私がやりたかったpeopleのは、最新のものに基づいてそのような順序でソートすることです (1 つの行に多くの行がある可能性がanswer_sheets.date_answeredあることを導き出すことができます) 。peopleanswer_sheets

たとえば、テーブルがあるとします

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


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

行に基づいて順番peopleに並べたいと思っていましたASCpeopleanswer_sheets.date_answered

出力は

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

s 4 と 5 には がありませんがpeople、リストに含める必要があることがわかります。質問: これに適した SQL クエリは何ですか? ありがとう。idanswer_sheet

4

3 に答える 3

4

一致がない場合でもレコードを表示するには、LEFT JOINを使用できます。

SELECT p.id, p.name, MAX(a.date_answered)
FROM people p
LEFT JOIN answer_sheets a on p.id = a.personID
GROUP BY p.id, p.name
ORDER BY MAX(date_answered) ASC

そして、試してみたい、またはもっと遊んでみたいという方のために、私はSQLFiddleを作成しました...

于 2012-06-27T03:50:08.787 に答える
1
SELECT
  people.id,
  people.name,
  baseview.last_date_answered
FROM (
  SELECT
    person_id,
    MAX(date_answered) AS last_date_answered
  FROM answer_sheets
  ORDER BY IFNULL(MAX(date_answered),'0001-01-01')
  ) AS baseview
  INNER JOIN people ON bseview.person_id=people.id
于 2012-06-27T03:38:24.297 に答える
0

SELECT  *
FROM    people
        CROSS APPLY ( SELECT    MAX(date_answered) MaxDate
                      FROM      answer_sheets
                      WHERE     answer_sheets.PersonID = people.ID
                    ) L
于 2012-06-27T07:57:49.763 に答える