2017-05-03 14 views
-1

私はあなたの助けが必要です。私は2つのテーブルを持っています。最初の(センサ)にはセンサとその情報のリストがあり、2番目のテーブル(timegetdata)にはこれらのセンサによって取得されたデータがあり、発生した時刻があります。私はセンサーのリスト、それらに関する情報、最後に取ったデータを選択する必要があります。 クエリを作成しましたが、正しく動作しません。Sql inner joinとmax()

SELECT 
    timegetdata.idsensor, 
    sensors.type, 
    sensors.lng, 
    sensors.lat, 
    MAX(timegetdata.time) AS time, 
    timegetdata.carbon_monoxide, 
    timegetdata.ammonia, 
    timegetdata.alcohol, 
    timegetdata.benzene, 
    timegetdata.smoke, 
    timegetdata.propane, 
    timegetdata.butan, 
    timegetdata.methane, 
    timegetdata.formaldehyde, 
    timegetdata.acetone, 
    timegetdata.toluene 
FROM sensors 
INNER JOIN timegetdata 
    ON sensors.idsensor = timegetdata.idsensor 
GROUP BY sensors.idsensor 
+1

エラーは何ですか? – warsong

+0

参照http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-クエリ – Strawberry

+2

[SQLの列の最大値を持つ行のみを選択]の可能な複製(http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column) – Shadow

答えて

0

max()最後の行の情報を探しています。これらは異なっています。

select t.idsensor, s.type, s.lng, s.lat, 
     t.time, t.carbon_monoxide, 
     t.ammonia, t.alcohol, 
     t.benzene, t.smoke, t.propane, 
     t.butan, t.methane, t.formaldehyde, 
     t.acetone, t.toluene 
from sensors s inner join 
    timegetdata t 
    on s.idsensor = t.idsensor 
where t.time = (select max(t2.time) 
       from timegetdata t2 
       where t2.idsensor = t.idsensor 
       ); 

また、テーブルエイリアスが使用されているため、クエリを書きやすく読みやすくなっています。

+0

'どのくらい簡単にクエリを書いて読み込むのですか?...これを簡単に呼び出すと、何が簡単でないのか怖いです:-) –

+0

@Gordon Linoffありがとう! – Maxymko

0

その後、sensorsテーブルにそのサブクエリをjoning、別のサブクエリにtimegetdataテーブルから最大時間を計算してみます。さらに、各idsensorグループの最大時間レコードに対応するそのテーブルから他の列を引き込むには、もう一度timegetdataに参加する必要があります。

SELECT 
    s.idsensor, 
    s.type, 
    s.lng, 
    s.lat, 
    t1.time, 
    t2.carbon_monoxide, 
    t2.ammonia, 
    t2.alcohol, 
    t2.benzene, 
    t2.smoke, 
    t2.propane, 
    t2.butan, 
    t2.methane, 
    t2.formaldehyde, 
    t2.acetone, 
    t2.toluene 
FROM sensors s 
INNER JOIN 
(
    SELECT idsensor, MAX(time) AS time 
    FROM timegetdata 
    GROUP BY idsensor 
) t1 
    ON s.idsensor = t1.idsensor 
INNER JOIN timegetdata t2 
    ON t1.idsensor = t2.idsensor 
0

としてあなたのクエリ構文は、あなたが他の列を表示する必要がある場合、あなたはexpression.suchによってグループでそれらを含める必要があり、適切ではない:あなたが探していません

group by column1, column2, ..columnn