2010-05-19 96 views
0

我试图用连接创建一个中等复杂的查询:SQL连接“涨”两个表

SELECT `history`.`id`, 
     `parts`.`type_id`, 
     `serialized_parts`.`serial`, 
     `history_actions`.`action`, 
     `history`.`date_added` 
FROM `history_actions`, `history` 
LEFT OUTER JOIN `parts` ON `parts`.`id` = `history`.`part_id` 
LEFT OUTER JOIN `serialized_parts` ON `serialized_parts`.`parts_id` = `history`.`part_id` 
WHERE `history_actions`.`id` = `history`.`action_id` 
    AND `history`.`unit_id` = '1' 
ORDER BY `history`.`id` DESC 

我想,以取代在``用SELECT语句parts`.`type_id` part_list`.`name`这里我需要强制执行的关系是`part_list`.`id` =`parts`.`type_id`。此外,我必须使用连接,因为在某些情况下`history`.`part_id`可能为NULL,这显然不是有效的部件ID。我将如何修改查询来做到这一点?

这里是要求一些样本日期: 历史表:
alt text http://ianburris.com/dropbox/public/so/q1/history.jpg
serialized_pa​​rts表:
alt text http://ianburris.com/dropbox/public/so/q1/serialized_parts.jpg
配件表:
alt text http://ianburris.com/dropbox/public/so/q1/parts.jpg
part_list表:
alt text http://ianburris.com/dropbox/public/so/q1/part_list.jpg

什么我想看到的是:

id name   serial action date_added 
4 Battery  567  added 2010-05-19 10:42:51 
3 Antenna Board 345  added 2010-05-19 10:42:51 
2 Main Board  123  added 2010-05-19 10:42:51 
1 NULL   NULL created 2010-05-19 10:42:51 
+2

首先开始摆脱隐含的连接。他们是一个不好的做法,并且与左连接结合在一起时非常混乱。 我也不清楚你在问什么,你能提供样品数据,因为它在表格中,你想看到什么回报。 – HLGEM 2010-05-19 16:49:19

+0

隐含连接是什么意思?是的,我现在要添加一些示例数据。 – blcArmadillo 2010-05-19 16:50:46

+0

'隐含'连接是当你列出用逗号分隔的表时 - 你的例子有'history_actions,history'。请参阅下面的答案,了解如何将其明确设置为INNER JOIN。 – AvatarKava 2010-05-19 16:56:42

回答

2

这至少是在正确的轨道上......

如果你正在寻找不显示任何部位使用无效的ID,只需更改LEFT JOIN的为内部连接(它们会限制NULL值)

SELECT `history`.`id` 
     , `parts`.`type_id` 
     , `part_list`.`name` 
     , `serialized_parts`.`serial` 
     , `history_actions`.`action` 
     , `history`.`date_added` 
     FROM `history_actions` 
INNER JOIN `history` ON `history`.`action_id` = `history_actions`.`id` 
LEFT JOIN `parts` ON `parts`.`id` = `history`.`part_id`  
LEFT JOIN `serialized_parts` ON `serialized_parts`.`parts_id` = `history`.`part_id` 
LEFT JOIN `part_list` ON `part_list`.`id` = `parts`.`type_id` 
    WHERE `history`.`unit_id` = '1' 
    ORDER BY `history`.`id` DESC 
+0

可能是这样,所以+1。 – Tomalak 2010-05-19 16:59:12

+0

谢谢你的帮助。 – blcArmadillo 2010-05-19 17:05:34

0

男孩,这些反斜杠让我的眼睛受伤。

SELECT 
    h.id, 
    p.type_id, 
    pl.name, 
    sp.serial, 
    ha.action, 
    h.date_added 
FROM 
    history      h 
    INNER JOIN history_actions ha ON ha.id  = h.action_id 
    LEFT JOIN parts    p ON p.id  = h.part_id 
    LEFT JOIN serialized_parts sp ON sp.parts_id = h.part_id 
    LEFT JOIN part_list  pl ON pl.id  = p.type_id 
WHERE 
    h.unit_id = '1' 
ORDER BY 
    history.id DESC 
+0

我说同样的事情:反引号:)我总是发现看到我们应用于我们查询的所有不同的格式风格很​​有趣。 – AvatarKava 2010-05-19 17:07:43

+0

@AvatarKava:我觉得这是最可读的形式。尽管我的SQL格式非常有教条意义,但我还得重新格式化其他人写的SQL,然后我才会关注它的功能。 ;-)然而,反蜱字面上让我的眼睛受伤。他们从字面上使整个陈述对我来说是不可读的。 – Tomalak 2010-05-19 17:20:29