MySQL объединяется с предложением WHERE - PullRequest
2 голосов
/ 26 июля 2010

У меня есть 2 запроса, которые отображают 2 разных значения, но результаты одного запроса являются неожиданными.

Запрос1:

SELECT SUM(T.amount_reward_user) AS total_grouping
   FROM fem_user_cards UC
       LEFT JOIN fem_transactions T USING(card_number)
       LEFT JOIN fem_company_login FCL 
                        ON T.fem_company_login_id=FCL.fem_company_login_id
   WHERE UC.fem_user_login_id=193 
                      AND FCL.grouping<>0 AND T.from_group=1 AND T.authorised=1
   GROUP BY UC.fem_user_login_id

Приведенный выше запрос дает мне общую сумму вознаграждения для пользователя193. Здесь условие - это сумма вознаграждения, которую я получаю по этому запросу, должна быть из группы, что видно из T.from_group = 1.Так что, похоже, это работает правильно.

Query2:

   SELECT SUM(T.amount_reward_user) AS total_grouping 
     FROM fem_transactions T 
LEFT JOIN fem_company_login FCL 
ON T.fem_company_login_id=FCL.fem_company_login_id 
    WHERE T.fem_user_login_id=193 
      AND FCL.grouping<>0 AND T.from_group=1 AND T.authorised=1

В этом запросе, даже если T.from_group = 1, он также суммирует сумму вознаграждения с T.from_group = 0,Кто-нибудь знает, в чем проблема?

Например:

Пользователь 193 купил что-то в компании A (в группе T.from_group = 1) за 5 долларов и получил вознаграждение за1 $ и купил другой продукт за 5 $ у компании B (вне группы, так что T.from_group = 0) и снова получил вознаграждение в 1 $.

Мой ожидаемый результат: 1

Я получаю:

Запрос1: 1

Запрос2: 2

Я мог бы просто использовать запрос 1, но у меня возникают проблемы с другими вещами, когда я его использую, поэтому мне нужно понять, чтона самом деле !!


Моя цель - получить сумму вознаграждений из базы данных.Сумма должна быть разных сгруппированных компаний.То есть, если у нас есть 5 разных сгруппированных компаний, и пользователь использует свою денежную карту в этих 5 компаниях, я должен получить 5 разных итогов.Если он использовал свою карту в какой-либо компании, не входящей в группу, в общую сумму не должна входить транзакция от этой группы.У меня есть код C ++ для подачи базы данных, как транзакции происходят.Моя таблица fem_transactions имеет company_id, amount_reward_user, fem_user_login_id, from_group (это решает, прошел ли пользователь транзакцию из группы или из группы), авторизован и т. Д.

Я хочу отфильтровать сумму, потраченную пользователем 193в каждой группе отдельно.

Теперь я понял концепции JOINTS, но мне нужно знать, почему t.from_group во втором запросе игнорируется?

1 Ответ

2 голосов
/ 26 июля 2010

Проблема в том, что в предложении «Где» имеются критерии для столбцов с правой стороны левого соединения. В обоих запросах это And FCL.grouping <> 0. Это фактически заменяет левое соединение на внутреннее соединение, поскольку требуется, чтобы значение FCL.grouping существовало, а не было равно нулю (или нулю). Я думаю, что вы хотите переместить эти критерии в предложение On:

Первый запрос:

Select Sum(T.amount_reward_user) AS total_grouping
From fem_user_cards UC
    Left Join fem_transactions T Using(card_number)
    Left Join fem_company_login FCL
        On FCL.fem_company_login_id = T.fem_company_login_id
            And FCL.grouping<>0
Where UC.fem_user_login_id=193 
    And T.from_group=1 
    And T.authorised=1
Group By UC.fem_user_login_id

Второй запрос

Select Sum(T.amount_reward_user) AS total_grouping
From fem_transactions T
    Left Join fem_company_login FCL
        On FCL.fem_company_login_id = T.fem_company_login_id
            And FCL.grouping<>0
Where UC.fem_user_login_id=193 
    And T.from_group=1 
    And T.authorised=1

Что не ясно во всем этом - это то, чего вы пытаетесь достичь. То есть, зачем даже левые объединения в любом запросе, если вы не фильтруете их. Если вы действительно хотите фильтровать строки, в которых есть значение fem_company_login со значением группировки <> 0, используйте исходный запрос и измените левое соединение на внутреннее соединение. Если вы хотите отфильтровать людей, которые имеют групповое значение <> 0 или вообще не имеют значения, выполните что-то вроде:

Select Sum(T.amount_reward_user) AS total_grouping
From fem_transactions T
    Left Join fem_company_login FCL
        On FCL.fem_company_login_id = T.fem_company_login_id
Where UC.fem_user_login_id=193 
    And T.from_group=1 
    And T.authorised=1
    And ( FCL.PrimaryKeyColumn Is Null Or FCL.grouping <> 0 )
...