СВОБОДНОЕ владение синтаксисом соединения MySQL СЛЕВА НАПРАВО

#mysql

#mysql

Вопрос:

Я часто сталкиваюсь с этой ситуацией, у меня будет запрос, в котором будет одна таблица, необходимая в условии соединения, в которой может не быть записей, поэтому мне нужно использовать ЛЕВОЕ СОЕДИНЕНИЕ. Я не могу разобраться в синтаксисе, когда он используется с более чем 1 соединением.

У меня будет:

 SELECT A.*, B.*, C.*
FROM A, B, C
WHERE A.id = C.id
AND C.aid = A.id
AND B.cid = C.id
  

Наряду с D появляется возможность быть пустым, и мне приходится переписывать запрос и сталкиваться с проблемами.

Как я могу просто присоединить D к любой из этих таблиц?

Комментарии:

1. Я вижу, что кто-то нашел там способ ответить на мой неработающий вопрос jquery, хахаха

Ответ №1:

Вам гораздо лучше явно указать все ваши соединения. Это должно сделать вещи намного понятнее.

 SELECT A.*, B.*, C.*, D.*
    FROM A
        INNER JOIN C
            ON C.aid = A.id
        INNER JOIN B
            ON B.cid = C.id
        LEFT JOIN D
            ON C.did = d.id
  

Ответ №2:

Мой совет — никогда не указывать более одного столбца в предложении FROM .

Для ясности лучше всегда:

  • Используйте предложение JOIN
  • Используйте псевдонимы
  • Укажите столбцы объединяемых таблиц в левой части знака равенства

Пример:

 SELECT a.*, b.*, c.*
FROM ATable a
INNER JOIN BTable b
  ON b.id = a.id
INNER JOIN CTable c
  ON c.id = a.id
WHERE a.someColumn = 'something'
  

Не уверен насчет MySQL, но в некоторых других вариантах SQL вы можете использовать то же самое при ОБНОВЛЕНИЯХ и УДАЛЕНИЯХ, например:

 DELETE FROM a
FROM ATable a
INNER JOIN BTable b
  ON b.id = a.id
INNER JOIN CTable c
  ON c.id = a.id
WHERE a.someColumn = 'something'
  

или

 UPDATE a
SET  something = newValue
FROM ATable a
INNER JOIN BTable b
  ON b.id = a.id
INNER JOIN CTable c
  ON c.id = a.id
WHERE a.someColumn = 'something'
  

Ответ №3:

Приведенный ниже синтаксис должен вам помочь. Основная предпосылка заключается в том, что любая таблица, указанная СЛЕВА, является обязательной.. таблица (или псевдоним) справа необязательна. Я понимаю, что вы не совсем понимаете, и ваш пример синтаксиса показывает это (не для критики), поскольку вы соединяетесь из A -> C и C обратно в A в другом поле. Если это тот случай, когда в таблице «C» есть два поля, которые ОБА указывают на A, вы должны повторно присоединиться к A в качестве второго псевдонима…

 select 
      Want.*,
      Maybe.*,
      SecondA.*,
      B.*
   From
      A as Want
         LEFT JOIN C as Maybe
            on Want.ID = Maybe.ID

            JOIN A as SecondA
               on Maybe.AID = SecondA.ID
            JOIN B
               on Maybe.ID = B.cID
  

Итак, в этом запросе указано, что я хочу все из таблицы A (псевдоним Want — левая сторона / первая таблица в списке), независимо от наличия совпадения в таблице C (возможно, псевдоним), где совпадают ключи идентификатора.

Обратите внимание, что следующие соединения идут вниз от «C» обратно ко второму экземпляру «A» и таблице B. У меня это просто объединения… Таким образом, связь между псевдонимом «Maybe» и псевдонимом второго экземпляра «A» и «B» является JOIN (обязательно).

Надеюсь, это даст некоторое лучшее разъяснение того, КАК это работает.

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

Ответ №4:

Надеюсь, это поможет

 SELECT 
A.*, B.*, C.*
FROM A
inner join C on(A.id = C.id)
inner join B on(B.cid = C.id)