MYSQL объединение по нескольким критериям не работает - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть запрос, который использует LEFT JOIN с несколькими критериями для получения данных.Однако запрос не возвращает никаких данных, когда я использую более одного условия AND в условиях.

Например:

LEFT JOIN tblName 
  on x.ABC=y.ABC 
 AND x.MNO="AnyValue" 
 AND x.UserId=1 

не возвращает никаких данных.

Однако, когда я удаляю последнее предложение AND (то есть LEFT JOIN tblName on x.ABC=y.ABC AND x.MNO="AnyValue"), это дает мне неверный результат.Но да, по крайней мере, вернуть некоторые данные.

Дайте мне знать, как добавить несколько условий, чтобы запрос работал.

Я хочу получить результаты, используя указанное выше первое условие, т.е. LEFT JOIN tblName on x.ABC=y.ABC AND x.MNO="AnyValue" AND x.UserId=1

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Во-первых, давайте удостоверимся, что вы понимаете, что такое левое соединение. Попробуйте думать об этом так. Левая сторона - это то, как я думаю в последовательном порядке предложения FROM. Вы читаете слева направо, поэтому первая таблица - это моя ЛЕВАЯ сторона, которую я ВСЕГДА хочу. Правая сторона (следующая таблица в запросе) является необязательной, но если она существует, отлично, у меня есть больше деталей.

Так возьмите сценарий людей и заказов. Я хочу список всех людей. Но если у них есть заказ, это еще лучше.

select 
      P.LastName,
      O.OrderID,
      O.OrderDate
   from 
      People P
         LEFT JOIN Order O
            on P.PersonID = O.PersonID 

Это сделает именно это. Покажите всем людям, и если у них есть заказ, который приходит для поездки. Если у них есть несколько заказов, будет показана строка для ВСЕХ заказов, которые у них были.

Теперь расширим критерии до следующей таблицы. Допустим, я хотел показывать заказы только с 2018 года. Это станет частью предложения LEFT JOIN "ON", потому что я забочусь только о части заказов в требовании.

     LEFT JOIN Order O
        on P.PersonID = O.PersonID 
        AND O.OrderDate >= '2018-01-01'

Я все равно получу ВСЕХ людей, но информация о заказе будет показана только для тех, у кого дата заказа 1 января 2018 года или позже.

Теперь, если вы заботитесь только о ТОЛЬКО ЛЮДЯХ, У КОТОРЫХ БЫЛИ ЗАКАЗЫ, а заказы были включены после 2018 года, это в основном исключило бы необходимость ЛЕВОГО СОЕДИНЕНИЯ и превратилось в стандартное (ВНУТРЕННЕЕ) СОЕДИНЕНИЕ

    JOIN Order O
       on P.PersonID = O.PersonID 
       AND O.OrderDate >= '2018-01-01'

JOIN Обязательно должна быть найдена запись в боковой таблице ORDER

Итак, в вашем сценарии, откуда берутся ваши псевдонимы "x" и "y". Совершенно неясно с учетом контекста, но, надеюсь, приведенные выше пояснения помогут вам решить ваш запрос. Если нет, обновите его, уточнив и уточнив, что вы пытаетесь из него извлечь.

0 голосов
/ 12 сентября 2018

Ваши AND ... критерии должны быть в WHERE части запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...