Присоединяйтесь к столу с отношениями один-ко-многим, получая странные результаты - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь получить информацию о платеже, которая находится в другой таблице, для всех заказов, которые имеют онлайн-регистрацию в пределах определенного диапазона дат. Но я получаю противоречивые результаты, а также много дубликатов.

Я пытался выполнить простое соединение между tblpayments и tblorders, но это не сработало. Я полагаю, что проблема заключается в том, что tblpayments имеет отношение один-ко-многим с tblorders, так как может быть несколько платежей по одному и тому же ордеру. Имейте в виду, что это MYSql 5.6

Вот запрос, который я пробовал и в конечном итоге не сработал.

SELECT 
    pmtorderid,
    pmtorderdate AS 'Date',
    pmtamt,
    pmtchgtip,
    pmtident1,
    o.ordonlineorderid
FROM
    tblorders o
        LEFT OUTER JOIN
    tblpayments p ON p.pmtorderid = o.orderid
WHERE
    pmttype = 3
        AND o.ordonlineorderid IS NOT NULL
        AND DATE(PmtOrderDate) BETWEEN '2019-04-22' AND '2019-04-30'
GROUP BY PmtOrderID , PmtOrderDate

Когда я запрашиваю tblorders с предложением WHERE ниже, я получаю около 70+ записей, что точно, но когда я использую это предложение с JOIN, я получаю тысячи записей, которые, как я знаю, неверны.

WHERE pmttype = 3 
    AND o.ordonlineorderid IS NOT NULL 
    AND DATE(PmtOrderDate) BETWEEN '2019-04-22' AND '2019-04-30'

Ответы [ 3 ]

0 голосов
/ 07 мая 2019

Как вы указали, может быть несколько платежей за заказ и, возможно, один платеж за несколько заказов.В этом случае необходимо присоединиться к некоторым другим полям, возможно, через дополнительные таблицы.Не зная вашей схемы, мы не можем предложить никакого конкретного решения.

0 голосов
/ 07 мая 2019

Вместо использования левого внешнего соединения используйте соединение.Это исключит строки в tblorders без совпадающих строк в tblpayments.Кроме того, имена столбцов чувствительны к регистру, убедитесь, что их написание (включая регистр) правильное.

SELECT 
    p.pmtorderid,
    p.pmtorderdate AS 'Date',
    p.pmtamt,
    p.pmtchgtip,
    p.pmtident1,
    o.ordonlineorderid
FROM tblorders o
JOIN tblpayments p 
    ON p.pmtorderid = o.orderid
WHERE
    p.pmttype = 3
    AND o.ordonlineorderid IS NOT NULL
    AND DATE(p.pmtorderdate) BETWEEN '2019-04-22' AND '2019-04-30'
GROUP BY pmtorderid, pmtorderdate
0 голосов
/ 07 мая 2019

Похоже, у вас запуталась логика левого соединения.Используя левое объединение и добавляя, где условия для левой таблицы будут возвращать каждую строку в правой таблице, а некоторые строки будут иметь совпадение в левой таблице.

Исходя из вашего условия где, я думаю, вам нужны только строкикоторые находятся в ОБОИХ таблицах, и в этом случае измените свое объединение на ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

Вот ссылка, чтобы немного узнать о левом и внутреннем объединении: http://a4academics.com/tutorials/24-sql-tutorial/729-difference-between-inner-join-and-left-join

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