Создание левого внешнего соединения в MySQL с правыми ограничениями - PullRequest
1 голос
/ 23 июля 2010

Согласно https://stackoverflow.com/questions/3264227/relations-with-multiple-keys-in-doctrine-1-2, у меня есть две таблицы, к которым (поскольку я не могу заставить его работать в Doctrine) я пытаюсь присоединиться как представление MySQL:

часть:

  • part_id
  • product_id
  • part_type_id
  • part_short_code
  • ...

part_translation:

  • part_type_id
  • part_short_code
  • LANGUAGE_ID
  • internationalised_name
  • ...

для ограничения, что part_type_id и part_short_code должны совпадать для всех таблиц.

Это осложняется тем фактом, что:

  • Правая таблица (part_translation) может не иметь соответствующей строки (отсюда и левое соединение)
  • Правая таблица действительна только для присоединения, когда part_short_code! = '' И language_id = 1

У меня есть рабочий запрос:

SELECT * из части LEFT OUTER JOIN (SELECT * FROM part_translation ГДЕ language_id = 1 И part_short_code! = '') В качестве part_data_uk USING (part_type_id, part_short_code)

но а) это медленно (вероятно, из-за подзапроса) и б) я не могу превратить его в представление, потому что у меня появляется ошибка "# 1349 - SELECT представления содержит подзапрос в предложении FROM"

Я не могу понять, как еще добавить ограничения в правую таблицу, не заставляя объединение действовать как внутреннее соединение, и проверяя все строки, где правая часть равна нулю.

Может кто-нибудь сказать мне, как оптимизировать / улучшить этот запрос таким образом, чтобы избавиться от подзапроса и сделать его пригодным для использования в представлении?

Использование MySQL 5.0.45, FWIW.

Спасибо, Ричард

1 Ответ

3 голосов
/ 23 июля 2010

Вы можете поместить почти все в часть ON.Не будет красивым зрелищем, но оно может работать:

SELECT * FROM `part` `p` LEFT JOIN `part_translation` `t` ON (
    `p`.`part_type_id` = `t`.`part_type_id`
    AND `p`.`part_short_code` = `t`.`part_short_code`
    AND `t`.`part_short_code` != ""
    AND `t`.`language_id` = 1
)
...