Mysql 如果条件匹配,则从2个表返回数据

Mysql 如果条件匹配,则从2个表返回数据,mysql,Mysql,我真的不知道该怎么做。我有一个网站可以跟踪服务器何时停机。因此,我有一个名为servers的服务器名称和ID的表,还有一个保存错误消息的表名为errors。我想返回过去7天的类似日历的视图,该视图将显示我们的任何服务器是否发生错误 到目前为止,我有一个查询,它将为任何一台服务器查找当天的错误消息,但我不知道如何返回良好且没有错误的服务器 SELECT errors.error_id, servers.server_id, errors.start_time, servers.name FROM

我真的不知道该怎么做。我有一个网站可以跟踪服务器何时停机。因此,我有一个名为
servers
的服务器名称和ID的表,还有一个保存错误消息的表名为
errors
。我想返回过去7天的类似日历的视图,该视图将显示我们的任何服务器是否发生错误

到目前为止,我有一个查询,它将为任何一台服务器查找当天的错误消息,但我不知道如何返回良好且没有错误的服务器

SELECT errors.error_id, servers.server_id, errors.start_time, servers.name
FROM errors
INNER JOIN servers ON errors.server_id=servers.server_id
WHERE errors.start_time BETWEEN '2014-02-25 00:00:00' AND '2014-02-25 23:59:59'
我有它循环通过7天,所有的工作。但我被困在如何获取那天没有倒下的服务器的id和名称上。我一直在考虑在查询中实现IF或CASE,但我以前从未使用过它们,我不太确定这将如何工作


我需要为此运行多个查询吗?还是可以只运行一个查询?

不要在一天中循环,而是一次执行所有查询。假设您每天至少有一个错误,您可以从
错误
表中获取此信息。否则,您可能需要一个日历表:

SELECT dates.thedate, e.error_id, s.server_id, e.start_time, s.name
FROM (select distinct date(start_time) as thedate
      from errors
      where e.start_time BETWEEN '2014-02-25 00:00:00' AND '2014-03-03 23:59:59'
     ) dates cross join
     servers s LEFT OUTER JOIN
     errors e
     ON e.server_id = s.server_id;
这将每天为每个服务器的每个错误生成一行。如果没有错误,每个服务器的错误字段中将有一行
NULL
。如果要将其聚合,请执行以下操作:

SELECT dates.thedate, s.server_id, s.name, count(*) as numErrors,
       group_concat(error_id order by e.start_time) as errorIds,
       group_concat(se.tart_time order by e.start_time) as startTimes
FROM (select distinct date(start_time) as thedate
      from errors
      where e.start_time BETWEEN '2014-02-25 00:00:00' AND '2014-03-03 23:59:59'
     ) dates cross join
     servers s LEFT OUTER JOIN
     errors e
     ON e.server_id = s.server_id and date(e.start_time) = dates.thedate
GROUP BY dates.thedate, s.server_id, s.name;
编辑:

如果没有日历表,您可以按如下方式将每天插入查询:

SELECT dates.thedate, s.server_id, s.name, count(*) as numErrors,
       group_concat(error_id order by e.start_time) as errorIds,
       group_concat(se.tart_time order by e.start_time) as startTimes
FROM (select date('2014-02-25') as thedate union all
      select date('2014-02-26') union all
      select date('2014-02-27') union all
      select date('2014-02-28') union all
      select date('2014-03-01') union all
      select date('2014-03-02') union all
      select date('2014-03-03') 
     ) dates cross join
     servers s LEFT OUTER JOIN
     errors e
     ON e.server_id = s.server_id and date(e.start_time) = dates.thedate
GROUP BY dates.thedate, s.server_id, s.name;

如果可以在另一个查询中执行此操作,则可以获取所有有错误的服务器ID,并在servers表中执行select查询,获取服务器ID“where server_ID NOT in(servers_with_errors_ID)”在这里,您将获得所有好的服务器SID。您可以选择所有服务器,然后使用减号运算符减去所有坏的服务器?@Tommy我考虑过这样做。将匹配查询的结果添加到id数组中。将该数组输入第二个查询的WHERE claus,对吗?我昨天确实试过了,但遇到了一些问题他没有工作。是否有一种特定的方法将数组送入where claus?@Envious您应该这样做
选择servers.server\u id where servers.server\u id NOT IN(1,2,3,4,5)
。由于“1,2,3,4,5”您的服务器SID有错误,希望这次我能解释得更好。稍后我可以给你一个更好的答案,我现在没有太多时间…不能保证每天都会产生错误。我有可能在7天内不出错。日历表是如何工作的?我应该在里面插入什么?我对这个想法持开放态度,只是我不确定它将如何工作。我只是在数据库上运行了查询,结果成功了!现在正在把它放到我的php中。谢谢。