2017-04-22 3 views
2

生物学者とmySQL(バージョン5.7.13)がここで初心者です。私は現在、私の周りを包み込むことができない課題に直面しています。私は、時間とともに個人の目撃情報を記録したテーブルを持って、データからの抽出物は、次のようになります。サブセットの列をmysqlのサブセット内の他の列の最大値に基づいて選択する

Table "tblSightings" 
+---------------+---------+-----------+---------------------+ 
| id_individual | project | id_survey | Surveydatetime  | 
+---------------+---------+-----------+---------------------+ 
| A    |  1 | S1  | 2016-11-18 15:54:00 | 
| B    |  1 | S1  | 2016-11-18 15:54:00 | 
| C    |  1 | S1  | 2016-11-18 15:54:00 | 
| A    |  1 | S2  | 2016-11-06 13:33:00 | 
| B    |  1 | S2  | 2016-11-06 13:33:00 | 
| X    |  1 | S2  | 2016-11-06 13:33:00 | 
| A    |  2 | S3  | 2015-05-01 12:48:00 | 
+---------------+---------+-----------+---------------------+ 

私は何をしたいのは、個々の最も最近の目撃情報を一覧表示し、クエリを作成することです( id_individual + projectの最高のSurveydatetime)とそれに対応するid_surveyとその目撃中に一緒に目撃された他の全ての個人(GROUP_CONCAT(id_individual))と一緒に表示されます。例えば、データに基づいて、所望の結果が、ここで次のようになります。

+---------------+---------+---------------+------------+---------------------+ 
| id_individual | project | id_survey  | associates | latest    | 
+---------------+---------+---------------+------------+---------------------+ 
| A    |  1 | S1   | B C  | 2016-11-18 15:54:00 | 
| B    |  1 | S1   | A C  | 2016-11-18 15:54:00 | 
| C    |  1 | S1   | A B  | 2016-11-18 15:54:00 | 
| X    |  1 | S2   | A B  | 2016-11-06 13:33:00 | 
| A    |  2 | S3   |   | 2015-05-01 12:48:00 | 
+---------------+---------+---------------+------------+---------------------+ 

私は

SELECT 
id_individual, 
project, 
MAX(Surveydatetime) AS latest 
FROM tblSightings 
GROUP BY id_individual, project; 

で、個々の最新Surveydatetimeを取得する方法を見つけ出すんでした。しかし、私は相当を取得する方法を見つけ出すことはできません"id_survey"の列が "最新"であるため、すべてのid_individualsを目的の結果の関連列のGROUP_CONCATの表示から取得する方法もわかりません。 SELECTにid_surveyを含めると、GROUP BYに入れなければならないので、各個人用に複数の行が再度表示されます。

すべてのヘルプは大歓迎...「サブセットの最大」のためのほとんどの答えは、私がこれまでINNERはそれでSELECT文を使用して登録しようか見つけたが、私はこれがすべてで動作させることはできません!ありがとう!

答えて

0

は、ここでは、このクエリを記述するための一つの方法です:

SELECT t1.id_individual, t1.project, ts.id_survey, t1.latest, 
GROUP_CONCAT(t2.id_individual) AS associates 

FROM tblSightings ts 
    INNER JOIN 
    (SELECT 
      id_individual, 
      project, MAX(Surveydatetime) AS latest 
     FROM tblSightings 
     GROUP BY id_individual, project 
    ) t1 
     ON t1.id_individual = ts.id_individual 
     AND t1.project = ts.project 
     AND t1.latest = ts.Surveydatetime 

    LEFT JOIN tblSightings t2 
     ON ts.id_survey = t2.id_survey 
     AND ts.project = t2.project 
     AND t1.latest = t2.Surveydatetime 
     AND t1.id_individual != t2.id_individual 

    GROUP BY t1.id_individual, t1.project, ts.id_survey, t1.latest 
    ORDER BY t1.latest DESC, t1.project, t1.id_individual, ts.id_survey; 


説明:

与えられたフォーマットの結果を達成するには、同じテーブルを3回追加する必要があります(JOIN)。最初はINNER JOINで、プロジェクトごとに個人ごとのタイムスタンプが最も高いレコードのid_surveyを取得するために使用されます。 2番目は、特定の個人に関連があるかどうかを判断することです。 (S3で見られるように)アソシエートが一切ないので、ここではLEFT JOINを使用します。このLEFT JOINは、レコードが処理されている個人と同じではないが、同じプロジェクトと調査の一部であるid_individualにのみ動作することも確認します。


Demo link

+0

完璧な、これは動作します!どうもありがとうございました!今私は本当にこの周りに私の頭を包む必要があります、詳細な説明に感謝! – Sam

+0

ありがとう..嬉しいことに! –

0

はこれを試してみてください:

Select 
     t2.id_individual, t2.project, t2.survey id_survey, 
     (
      Select GROUP_CONCAT(tt.id_individual) 
      From tblsightings tt 
      Where tt.project = t2.project and tt.id_survey = t2.survey and tt.id_individual <> t2.id_individual 
     ) associates, 
     t2.maxdate latest 
From 
(
     Select t1.project, t1.id_individual, maxdate, 
      (
       Select id_survey 
       From tblsightings tt 
       Where tt.project = t1.project and tt.id_individual = t1.id_individual and tt.surveydatetime = t1.maxdate 
      ) survey 
     From 
     (
      Select project, id_individual, max(surveydatetime) maxdate 
      From tblsightings t1 
      Group by project, id_individual 
    ) t1 
) t2 
Order by t2.project, t2.id_individual 

データを私が使用:

CREATE TABLE tblsightings 
(
    id_individual varchar(100), 
    surveydatetime varchar(100), 
    id_survey varchar(100), 
    project varchar(100) 

); 

INSERT INTO tblsightings (id_individual,surveydatetime,id_survey,project) VALUES ("A","2016-11-18 15:54:00","S1","1"); 
INSERT INTO tblsightings (id_individual,surveydatetime,id_survey,project) VALUES ("B","2016-11-18 15:54:00","S1","1"); 
INSERT INTO tblsightings (id_individual,surveydatetime,id_survey,project) VALUES ("C","2016-11-18 15:54:00","S1","1"); 
INSERT INTO tblsightings (id_individual,surveydatetime,id_survey,project) VALUES ("A","2016-11-06 13:33:00","S2","1"); 
INSERT INTO tblsightings (id_individual,surveydatetime,id_survey,project) VALUES ("B","2016-11-06 13:33:00","S2","1"); 
INSERT INTO tblsightings (id_individual,surveydatetime,id_survey,project) VALUES ("X","2016-11-06 13:33:00","S2","1"); 
INSERT INTO tblsightings (id_individual,surveydatetime,id_survey,project) VALUES ("A","2015-05-01 12:48:00","S3","2"); 
+0

ありがとうございます!私はそれを一緒に置くとき、私は "サブクエリは、複数の列を返します"エラーを取得します。私は努力し続けます、あなたの答えは大変ありがとうございます – Sam

+0

@Sam Hmm、ok。私は原因が "調査"サブクエリにあると思う。 id_surveyではなくmax(id_survey)がそれを解決するかもしれません。しかし、それは、いくつかのプロジェクト+ id_individualに対して複数の同等のサーベイデートがあることを意味します。とにかく、あなたはすでに実用的な答えを持っています。ようこそ! – Demo

+0

私はそれで遊んでいます、私は本当にこのすべての作品がどのように理解したいです。私は単純なクエリ、結合などで大丈夫をしていますが、この挑戦​​は本当に私の頭を傷つけました。あなたの努力のためにありがとう! – Sam

関連する問題