MySQL与WHERE子句连接

时间:2010-07-26 18:30:58

标签: sql mysql phpmyadmin aggregate-functions

我有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以5美元的价格购买公司A(在组中,因此T.from_group = 1)并获得1美元的奖励,并从公司B以5美元的价格购买了另一种产品(因此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 个答案:

答案 0 :(得分:2)

问题是你在Where子句中有针对Left Join右侧列的标准。在这两个查询中,这是And FCL.grouping <> 0。这有效地将Left Join更改为Inner Join,因为您要求FCL.grouping值存在且不为零(或Null)。我想,你想要的是将该标准转移到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值并且分组值为&lt;&gt;的行0,然后使用原始查询并将左连接更改为内连接。如果您要过滤具有分组值&lt;&gt;的人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 )