Sql内连接和max()

时间:2017-05-03 10:31:28

标签: mysql sql

我需要你的帮助。我有两个表,第一个(传感器)有一个传感器列表和有关它们的信息,在第二个表(timegetdata)中有这些传感器采集的数据,并且有一段时间它发生。我需要选择传感器列表,有关它们的信息以及它们最后获取的数据。 我写了一个查询,但它工作不正确。

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

3 个答案:

答案 0 :(得分:0)

尝试在单独的子查询中计算timegetdata表的最大时间,然后将该子查询称为sensors表。此外,您需要再次加入timegetdata以从该表中提取与每个idsensor组的最大时间记录对应的其他列。

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

答案 1 :(得分:0)

您的查询语法不正确,如果您需要显示其他列,则必须通过表达式将它们包含在组中。例如:

group by column1, column2, ..columnn

答案 2 :(得分:0)

您不是在寻找max()。您正在寻找 last 行中的信息。这些是不同的。

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
               );

另请注意,编写和读取查询更容易,因为它使用表别名。