2012-01-13 90 views
2

我有3个表格。 service_robot_errorservice包含一个作为服务表中主键的外键。 robot_error没有矿石给出任何外键。从多个查询中搜索并打印结果

TABLE: robot_error 
| id | date | stop_time | start_time | robot | position | error_code | observation | solution | downtime | logged_by | 
| 1 | 02.01.2012 | 14:51:31 | 14:52:00 | 20 | 25/7 | 214 | X dir | Rob off | 29 | XXX | 

TABLE: service 
| service_id | service_date | service_module | service_user | service_comment | service_type | 
| 1 | 13.01.2012 | Robot | XXX | Test service | Errorservice | 

TABLE: service_robot_errorservice 
| errorservice_id | service_id | errorservice_robot | errorservice_tracksensor | errorservice_gripper | 
| 5 | 1 | 54 | OK | OK | 

当一个机器人在用户搜索(EKS 16)我希望得到的结果是在robot_error每个实例按日期orderd,如果机器人具有服务注册这种情况下也应在结果中显示。

例子:

robot_error instance 
robot_error instance 
robot_error instance 
service instance 
robot_error instance 
service instance 

,这就是我想要的结果看。我tryed首先得到的结果出来这个SQL

SELECT * FROM robot_error WHERE robot = '16' 

和使while循环中robot_error表中的所有结果,但我无法弄清楚如何我可以使结果从要显示服务表,可以有人帮忙吗? :)

+0

所以你要找到'robot_error'所有记录与特定'id'一个机器人和一个记录从'service'如果该机器人有与之相关的服务?在'service_robot_errorservice'表中,'errorervice_robot'是机器人的'id'吗? – 2012-01-13 11:47:27

+0

,如果该机器人具有与其相关的服务,则来自服务的单个记录?这不一定是单一的,它可以是0到很多。 errorservice_robot是机器人的ID,是的。它与robot_error中使用的id相同。 robot = errorservice_robot – 2012-01-13 11:53:18

回答

0

我建议使用joins

  • JOIN:返回行的时候有两个表
  • LEFT JOIN中至少有一个匹配:左表返回所有行,即使在右表
  • 没有匹配RIGHT JOIN:右表中返回所有行,即使在左表
  • FULL不匹配连接:返回行的时候出现在表

之一的比赛,但你必须有一个robot_error和serv之间的关系在可以使用带有连接的查询之前加冰。或许,这将是这个样子:

SELECT * FROM robot_error LEFT OUTER JOIN services ON robot_error.ID = services.FK WHERE robot = '16' 

Jeff Atwood demonstrates the different Joins相当nicley

+0

我不认为我可以使用连接beacuse我得到这个结果: robot_error xxx | service_id 1 robot_error xxx | service_id 1 如果该机器人上有16个robot_errors,则该联接将从服务表中创建16个实例。可能有16个错误,但只有1个服务。也可能有1个错误和5个服务。这里是一个图像来说明 http://bildr.no/view/1076987 – 2012-01-13 12:19:34

+0

结果 - 意味着没有什么可以加入。这是设计并暗示查询的错误或数据集的关系。如上所述,robot_error和服务表必须有关系才能工作。我使用robot_error.ID和service.FK作为您必须自己实现关系的占位符。你也可以玩查询并检查你得到的结果,最终你会发现。 – SanBen 2012-01-13 12:31:21

+0

我很确定这个设置不是[标准化](http://en.wikipedia.org/wiki/Database_normalization)。不过,我认为表service_robot_errorservice持有密钥;)。如果robot_error和service的ID都在该表中,则可以使用查询来获取所需的信息。这样的事情:SELECT * FROM service_robot_errorservice LEFT OUTER JOIN robot_error ON service_robot_errorservice.errorservice_robot = error_robot.id LEFT OUTER JOIN service ON service_robot_errorservice.service_id = service.service_id WHERE robot_error.robot ='16'这是从头部所以检查它 – SanBen 2012-01-13 13:44:00