2011-02-09 4 views
1

У меня есть несколько таблиц, к которым я присоединяюсь, что мне нужно добавить другую таблицу, и я не могу получить правильный запрос. Вот что у меня есть сейчас -MySQL: многостолбцовое соединение на нескольких таблицах

Таблица 1
carid, CatID, makeid, ModelID, caryear

Таблица 2
makeid, makename

Таблица 3
ModelID, ModelName

Таблица 4
catid, catname

Запрос Я использую, чтобы присоединиться к этим является:

SELECT * FROM table1 a 
    JOIN table2 b on a.makeid=b.makeid 
    JOIN table3 c on a.modelid=c.modelid 
    JOIN table4 d on a.catid=d.catid 
    WHERE a.carid = $carid; 

Теперь мне нужно добавить 5-таблицу, я получаю от 3 участника, что я с трудом добавляя в существующий запрос. Новая таблица имеет следующие поля -

Таблица 5 И.Д., год, марка, модель, citympg, hwympg

мне нужно citympg и hwympg основанный на caryear из таблицы 1, makename из таблицы 2, и MODELNAME из таблица 3. Я знаю, что могу выполнить второй запрос с этими значениями, но я бы предпочел сделать один запрос и иметь все данные в одной строке. Можно ли это сделать в одном запросе? Если да, то как?

ответ

2

В объединении возможно иметь более чем условие. делает это?

SELECT a.*, e.citympg, e.hwympg 
FROM table1 a 
    JOIN table2 b on a.makeid=b.makeid 
    JOIN table3 c on a.modelid=c.modelid 
    JOIN table4 d on a.catid=d.catid 
    Join table5 e on b.makename = e.make 
       and c.modelname = e.model 
       and a.caryear = e.year 
    WHERE a.carid = $carid; 

... хотя ваш вопрос непонятен. Вы только хотите присоединиться к таблице5 к другим, или было что-то еще, что вы хотели сделать с table5?

+0

@Jim Garrison: Ой, подумайте, что это исправлено сейчас. – FrustratedWithFormsDesigner

+1

Я думаю, что Frustrated означал 'on a.caryear = e.year' вместо' on a.citympg = e.citympg и a.hwympg = e.hwympg' –

+0

@ypercube: er, да, ... вот что я имел в виду ! – FrustratedWithFormsDesigner

1

Без индексов, это не будет эффективным, но вы можете сделать

LEFT JOIN table5 ON (table2.make = table5.make AND table3.model = table5.model AND table1.caryear = table5.caryear) 

Это предполагает также марку и модель и годы строки соответствуют точно.

+1

Согласитесь, и я думаю, что вы можете есть проблемы, если имя похоже на «Эскорт» в одном «эскорте» в другом и «Эскорт» (космос в конце) в третьем. Вы можете обрезать пробелы и преобразовать в верхний или нижний регистр для сравнения. – Don

+0

Все модели и модели представлены в виде выпадающих списков, и они нормализованы до того, как они будут вставлены в таблицу, что поможет свести к минимуму проблемы с сопоставлением. –

Смежные вопросы