SQL объединяет две таблицы - PullRequest
0 голосов
/ 19 мая 2010

Я пытаюсь создать довольно сложный запрос с объединениями:

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

Я бы хотел заменить `parts`` type_id` в операторе SELECT на `part_list`` name`, где мне нужно установить взаимосвязь между двумя таблицами: `part_list``id` =` parts `.`type_id`. Также я должен использовать соединения, потому что в некоторых случаях `history``part_id` может иметь значение NULL, что, очевидно, не является действительным идентификатором детали. Как бы я изменил запрос, чтобы сделать это?

Вот пример даты запроса: таблица истории:
альтернативный текст http://ianburris.com/dropbox/public/so/q1/history.jpg
таблица serialized_parts:
альтернативный текст http://ianburris.com/dropbox/public/so/q1/serialized_parts.jpg
таблица деталей:
альтернативный текст http://ianburris.com/dropbox/public/so/q1/parts.jpg
таблица part_list:
альтернативный текст 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 ]

2 голосов
/ 19 мая 2010

Это было бы по крайней мере на правильном пути ...

Если вы хотите НЕ показывать какие-либо детали с недопустимым идентификатором, просто измените ЛЕВЫЕ СОЕДИНЕНИЯ на ВНУТРЕННИЕ СОЕДИНЕНИЯ (они ограничат значения 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 голосов
/ 19 мая 2010

Мальчик, эти спины заставляют мои глаза болеть.

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
...