需要帮助构建一个复杂的查询。

13 浏览
0 Comments

需要帮助构建一个复杂的查询。

我有两个表ServiceStatus。服务表只包含一个name和一个id

| id | name |

|----|-------|

| 1 | Test1 |

| 2 | Test2 |

还有一个状态表如下:

| id | status | service_id | timestamp |

|----|--------|------------|---------------------------|

| 1 | OK | 1 | October, 15 2015 09:03:07 |

| 2 | OK | 1 | October, 15 2015 09:08:07 |

| 3 | OK | 2 | October, 15 2015 10:05:23 |

| 4 | OK | 2 | October, 15 2015 10:15:23 |

我想获取以下数据:

| id | name | status | timestamp |

|----|-------|--------|---------------------------|

| 1 | Test1 | OK | October, 15 2015 09:08:07 |

| 2 | Test2 | OK | October, 15 2015 10:15:23 |

即最新的与服务数据相关的状态。我尝试了以下语句:

SELECT ser.id, ser.name, a.status, a.timestamp
from Service ser
  inner join (select * from status
              order by Status.timestamp
              DESC limit 1) as a
    on a.service_id = ser.id

但是我只得到了:

| id |  name | status |                 timestamp |
|----|-------|--------|---------------------------|
|  2 | Test2 |     OK | October, 15 2015 10:15:23 |

请问我该如何修改这个语句以得到我想要的结果?

可以在SQL Fiddle进行测试。

0
0 Comments

需要帮助构建一个复杂的查询。问题的原因是需要从每个服务中返回状态,但只有当不存在更新的状态时才返回。解决方法是使用NOT EXISTS来实现这个目的。以下是解决方法的具体内容:

首先,使用左连接查询将服务表和状态表连接起来。这样可以返回所有服务,包括没有状态的服务。

然后,使用NOT EXISTS子查询来过滤出只有当不存在更新的状态时才返回的记录。子查询中的条件是找到同一个服务的时间戳比当前记录的时间戳大的记录。

最后,将所需的字段包括服务的ID、名称、状态和时间戳选择出来。这样就能得到满足条件的结果了。

如果不想返回没有状态的服务,可以将左连接改为内连接(JOIN)。

下面是具体的代码实现:

select ser.id, ser.name, st.status, st.timestamp
from service ser
  left join status st1 on ser.id = st1.service_id
where not exists (select 1 from status st2
                  where st2.service_id = st1.service_id
                    and st2.timestamp > st1.timestamp)

通过这个查询语句,可以得到满足条件的结果,即返回每个服务的状态,但只有当不存在更新的状态时才返回。

0
0 Comments

需要构建一个复杂的查询,但是在尝试时遇到了困难。以上的代码是尝试解决问题的一部分。

问题的原因是需要从表中获取每个服务的最新状态。在这种情况下,需要使用窗口函数和子查询来实现这个目标。

解决方法是使用内连接和窗口函数来连接Service表和Status表,并使用子查询和窗口函数来计算每个服务的最新时间戳。然后,通过筛选出最新时间戳为1的记录来获取每个服务的最新状态。

这种解决方法可以确保获取到每个服务的最新状态,同时也避免了使用多个查询来实现相同的目标。

希望这个解决方法对你有所帮助。

0
0 Comments

原因:问题的出现是因为需要构建一个复杂的查询,要求查询结果包含服务的ID、名称、状态以及时间戳,并且只返回最新的状态信息。

解决方法:通过使用子查询和内连接,可以实现只返回最新状态信息的复杂查询。

具体的查询语句如下:

SELECT 
  ser.id, 
  ser.name, 
  s.status, 
  s.timestamp 
FROM Service ser 
INNER JOIN status as s ON s.service_id = ser.id
INNER JOIN
(
   SELECT
     service_id, 
     MAX(timestamp) AS MaxDate
   FROM status 
   GROUP BY service_id
) AS a  ON a.service_id = s.service_id 
       AND a.MaxDate = s.timestamp;

其中,子查询的目的是找到每个服务的最新时间戳(MAX(timestamp) AS MaxDate),并与服务ID进行分组(GROUP BY service_id)。然后,将这个子查询与status表进行内连接,通过匹配服务ID和最新时间戳,来获取最新的状态信息。

这样的查询语句可以有效地消除除了最新日期之外的所有状态信息,从而得到我们想要的结果。

最后,通过感谢反馈,确认这个解决方法非常有效。

0