mySQL: объединение нескольких столбцов в нескольких таблицах, часть II - PullRequest
0 голосов
/ 10 февраля 2011

Я добавляю 5-ю таблицу к существующему объединению. Исходный запрос всегда будет возвращать одну строку, поскольку в предложении where указан уникальный идентификатор. Вот таблицы, которые мы используем:

Таблица 1
Кэрид, Кэтид, Макейд, Моделид, Кэрэйр

Таблица 2
makeid, makename

Таблица 3
modelid, имя модели

Таблица 4
катида, кличка

Таблица 5 id, caryear, makename, имя модели

Вот существующий запрос, который я использую:

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;

Есть 2 вопроса, которые мне нужно решить -

  1. Если в таблице 5 нет совпадений, результаты не возвращаются. Казалось бы, мне нужно выполнить какое-то левое соединение или разделить запрос и сделать объединение.

  2. Когда в таблице 5 есть совпадение, он возвращает несколько строк. Поскольку критерии, возвращающие одну строку, не используются, я бы согласился на среднее значение citympg и hwympg.

Можно ли достичь обеих целей одним запросом? Как?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

Предполагая, что я правильно понимаю, что вы хотите ... Этот запрос будет ограничивать результаты из таблицы 5 одной строкой для комбинации критериев объединения, возвращая средний город / hwy миль на галлон.

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
LEFT JOIN (SELECT year, make, model, 
                  AVG(citympg) as citympg, 
                  AVG(hwympg) as hwympg           
           FROM table5 
           GROUP BY year, make, model) e on b.makename = e.make
                                         and c.modelname = e.model
                                         and a.caryear = e.year
WHERE a.carid = $carid;

Обратите внимание, что онвернет значения NULL mpg, если в таблице 5 нет записей.

0 голосов
/ 10 февраля 2011

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

SELECT a.*
  , (SELECT avg(e.citympg)
     FROM table5 e
     WHERE e.make = b.makename
       AND e.model = c.modelname
       AND e.year = a.caryear
    ) as citympg
  , (SELECT avg(e.hwympg)
     FROM table5 e
     WHERE e.make = b.makename
       AND e.model = c.modelname
       AND e.year = a.caryear
    ) as 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
WHERE a.carid = $carid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...