2010-05-19 248 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