Где условие применяется только к одному столбцу в соединении - PullRequest
0 голосов
/ 21 февраля 2019

У меня проблемы с написанием определенного SQL-запроса.У меня есть кошелек и баланс, к которому я присоединяюсь.Теперь запрос выглядит так:

SELECT
    `balances`.`id` AS `id`,
FROM
    `wallet` 
LEFT JOIN `balances` ON
    ( `wallet`.`currency` = `balances`.`currency` )
WHERE
    `balances`.`user_id` = '181'

Из-за предложения where запрос возвращает только совпадающие записи.Я хочу получить все записи из таблицы кошельков и только те из балансов, которые соответствуют пункту где ... надеюсь, я объяснил это достаточно хорошо!

Ура!

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

Переместить условие в предложение ON.Не используйте подзапросы!

SELECT w.*, b.id
FROM wallet w LEFT JOIN 
     balances b
     ON w.currency = b.currency AND
        b.user_id = 181;

Примечания:

  • Подзапрос в FROM может помешать оптимизатору.
  • Если вы используете LEFT JOIN, вы должны выбирать столбцы из таблицы first * 1013. *.
  • Я предполагаю, что user_id - это число, поэтому я удалил кавычки вокруг значения сравнения.
  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Обратные пометки затрудняют написание и сложность запроса.
0 голосов
/ 21 февраля 2019

Проблема в том, что вы применяете фильтр к кошелькам левой соединительной таблицы.

используйте запрос ниже.

SELECT
    `balances`.`id` AS `id`,
FROM
    `wallet` 
LEFT JOIN (select * from `balances` `user_id` = '181') ON
    ( `wallet`.`currency` = `balances`.`currency` );
0 голосов
/ 21 февраля 2019

Вопрос не совсем понятен, но вам почти наверняка понадобится дополнительное предложение join для какого-то идентификатора.Теперь нет способа сопоставить кошелек с его балансом (ами).Предполагая, что баланс есть, например.wallet_id, вам понадобится что-то вроде:

SELECT
    `balances`.`id` AS `id`,
FROM
    `wallet` 
LEFT JOIN `balances` ON
    (`wallet`.`id` = `balance`.`wallet_id` )
WHERE
    `balances`.`user_id` = '181'
0 голосов
/ 21 февраля 2019

использовать подзапрос

SELECT w.*,t.*        
FROM
    wallet w
LEFT JOIN ( select * from balances where user_id = 181
   ) t ON   w.currency =t.currency
...