2016-05-17 4 views
2

Я запускаю MySQL 5.1.71. В моей базе данных есть три таблицы - загрузка, латунь и mfg с нагрузкой, которая является моей «основной» таблицей. Моя цель - запросить загрузку и включить mfg.name в результаты. Я пробовал различные итерации JOIN статей и подзапросов как с предложениями WHERE, так и без них. Кажется, это должно быть довольно тривиально, поэтому я не уверен, как я не могу прийти к решению.SQL Join vs Sub-query

load 
------------------------- 
| id | desc | brass_id | 
------------------------- 
| 1 | One |  2 | 
| 2 | Two |  1 | 
------------------------- 

brass 
--------------- 
| id | mfg_id | 
--------------- 
| 1 |  6 | 
| 2 |  8 | 
--------------- 

brass_mfg 
------------------------ 
| id | name   | 
------------------------ 
| 6 | This Company | 
| 8 | That Company | 
------------------------ 

Мои желаемые результаты будут ...

results 
--------------------------- 
| load | mfg    | 
--------------------------- 
| One | That Company | 
| Two | This Company | 
--------------------------- 
  • нагрузка ID всегда будет иметь только один латунный ID
  • Духовой ID всегда будет иметь только один MFG ID



ED IT
Обновленные ранее данные образца (см. Выше) были обновлены. Кроме того, ниже приведен запрос, который я запускаю, и результаты, которые я получаю. Компания ошибается в каждой записи, которая возвращается. Я включил в запрос и результаты идентификаторы по всем таблицам. Имена компаний, которые отображаются, не являются именами для идентификаторов в таблице mfg.

SELECT 
    load.id AS "load.id", 
    load.brass_id AS "load.brass_id", 
    brass.id AS "brass.id", 
    brass.mfg_id AS "brass.mfg_id", 
    brass_mfg.id AS "brass_mfg.id", 
    brass_mfg.name AS "brass_mfg.name" 
FROM `load` 
LEFT JOIN brass ON load.brass_id = brass.id 
LEFT JOIN brass_mfg ON brass.id = brass_mfg.id 


----------------------------------------------------------------------------------------- 
| load.id | load.brass_id | brass.id | brass.mfg_id | brass_mfg.id | brass_mfg.name  | 
----------------------------------------------------------------------------------------- 
| 1  | 2    | 2  | 6   | 2   | Wrong Company  | 
| 2  | 1    | 1  | 8   | 1   | Incorrect Company | 
----------------------------------------------------------------------------------------- 
+3

Соединения являются основными строительными блоками SQL-запросов. Они должны быть вашим первым вариантом. Чтобы оптимизировать, посмотрите на индексы. – MatBailie

+0

Я действительно не вижу проблемы здесь. – Strawberry

+0

Стоит упомянуть, что ваш желаемый результат выглядит так, как будто вы предполагаете, что каждый 'продукт' будет иметь одну' mfg', а таблицу ассоциаций - 'lot' - обычно используется во многих отношениях для многих ... Помните об этом! – Darek

ответ

2

Посмотрите на ваших таблиц и посмотреть, что данные относятся друг к другу, а затем создать присоединяется таблицу таблицы, чтобы получить желаемый результат.

SELECT p.desc AS Product, m.name AS mfg 
FROM product p 
INNER JOIN lot l ON p.lot_id = l.id 
INNER JOIN mfg m ON l.mfg_id = m.id 
+0

Проблема заключалась в комбинации правильного типа соединения и наличии правильных левых и правых таблиц. В частности, ваше последнее состязание - это то, что поставило меня прямо. Огромное спасибо. – user1801810

0

У вас есть ошибка в вашем запросе соединения. Попробуйте это:

Select 
l.id AS "load.id", 
l.brass_id AS "load.brass_id", 
b.id AS "brass.id", 
b.mfg_id AS "brass.mfg_id", 
m.id AS "brass_mfg.id", 
m.`name` AS "brass_mfg.name" 
FROM `load` as l 
LEFT JOIN brass as b ON l.brass_id = b.id 
LEFT JOIN brass_mfg as m ON b.mfg_id = m.id 

enter image description here

Вам нужно LEFT JOIN только

+0

'LEFT JOIN' - самое близкое, что я пришел, но у меня плохие результаты. Составление дополнительной информации для редактирования в исходное сообщение. – user1801810

+0

Я думаю, что «LEFT JOIN» - лучший подход для вашего дизайна. Если у вас есть плохие результаты, вы можете поместить их, чтобы мы могли вам помочь. – wajeeh

+0

Обновлено оригинальное сообщение, чтобы отразить более реальные данные, добавленный запрос и результаты. – user1801810

0

Если это одно - одно отношение, почему с средней таблицы? В вашем случае лучший сценарий - простое соединение.

SELECT pt.desc as Product, mfg.name as Mfs 
FROM Product pt 
Join Lot lt on lt.id = pt.lot_id 
Join Mfg mf on mf.id = lt.mfg_id 
+0

Данный продукт будет иметь только один лот и, таким образом, один mfg. Тем не менее, может быть несколько продуктов, указывающих на одну и ту же партию. Кроме того, в каждой таблице есть разные поля, которые требуют наличия таблиц, разделенных так, как они есть. – user1801810