Вложенное соединение MySQL со ссылками на неопубликованные поля таблицы - PullRequest
0 голосов
/ 16 октября 2011

Это (пример) таблицы:

first:  id      abc

parent: id  childid  foo
         1        0       -- no  child
         2        1       -- one child

child:  id  abc  bar
         1
         2

last:   id  foo  bar

Я бы хотел выполнить следующий запрос:

SELECT
  first.*
 ,parent.*
 ,child.*
 ,last.*

FROM        first  -- actually some joins

-- select exactly 1 `parent` row for each `first` row
-- with an optional `child` row (or NULLs if child.id=0)
LEFT JOIN ( parent
LEFT JOIN   child ON child.id = parent.childid
                 AND child.abc = first.abc <== ERROR HERE
          )       ON parent.childid = 0
                  OR child.id


-- conditions referring to the parent,child rows
LEFT JOIN   last  ON last.foo = parent.foo
                 AND last.bar = child.bar

К сожалению, MySQL не любит внешние ссылки во вложенном соединении:
Unknown column 'first.abc' in 'on clause'

Я был бы рад, если бы кто-то мог помочь мне исправить этот тип запроса.

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Попробуйте вместо этого запрос:

SELECT first.*, parent.*, child.*, last.*
FROM first
LEFT JOIN parent ON parent.childid = 0 OR parent.childid IS NOT NULL
LEFT JOIN child ON child.id = parent.childid AND child.abc = first.abc
LEFT JOIN last  ON last.foo = parent.foo AND last.bar = child.bar
1 голос
/ 16 октября 2011
  1. Снять эти скобки!
  2. ON parent.childid = 0 OR child.id недопустимо.Используйте ON parent.childid in (0, child.id)

Это должно выглядеть так:

...
LEFT JOIN  parent  -- removed opening bracket
LEFT JOIN   child ON child.id = parent.childid
                 AND child.abc = first.abc 
                 AND parent.childid = in (0, child.Id) -- removed closing bracket and used 'IN'
...   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...