0

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

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のは、最新のものに基づいてそのような順序で並べ替えることです (1 つのAND行が多数になる可能性がanswer_sheets.date_answeredあることを導き出すことができます)。surveyspeopleanswer_sheetssurveys.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 s 4 と 5 にはin with = 1idがないにもかかわらず、リストに含める必要があることがわかります。質問: これに適した SQL クエリは何ですか? ありがとう。answer_sheetsurveysorg_id

4

3 に答える 3

1

このクエリは引き続き有効ですが、他の回答の方が適しています。フィドルはまだ有効ですが

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

これが私がこの夜の時間にできる最善のことについてです。はい、それは醜いです(非常に、非常に醜いです)が、それは望ましい出力を与えます。ユニオンとインを使わなければならないのは本当に嫌いですが、夜遅くなので何かが足りないのかもしれません。その点で、この/ 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 に答える
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 に答える
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 に答える