#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)