- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 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 中显而易见的组。所以这似乎是正确的。
查询2:
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 美元的奖励并从公司 B(在组外所以 T.from_group=0)购买了另一个产品 5 美元) 并再次获得 1 美元的奖励。
我的预期输出是:1
我得到:
查询 1: 1
查询 2:2
我可以简单地使用查询 1,但是当我使用它时我遇到了其他问题,所以我需要了解到底发生了什么!!
我的目标是从数据库中获取奖励金额的总和。总和应该是不同的集团公司。也就是说,如果我们有 5 个不同的分组公司,并且用户在这 5 个公司中使用他的 moneycard,我应该得到 5 个不同的总数。如果他在不属于该集团的任何公司使用他的卡,则总数不应包括来自这家未分组公司的交易。当交易发生时,我有 C++ 代码来提供数据库。我的 fem_transactions 表有 company_id、amount_reward_user、fem_user_login_id、from_group(这决定了用户是在群外交易还是在群外交易)、authorized 等。
我想分别过滤用户193在每个组中花费的金额。
我现在理解了 JOINTS 概念,但我需要知道为什么忽略第二个查询中的 t.from_group ?
最佳答案
问题是您在 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
的行具有分组值 <> 0 的值,然后使用您的原始查询并将 Left Join 更改为 Inner Join。如果您想过滤分组值 <> 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 )
关于sql - MySQL 加入 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337814/
我是一名优秀的程序员,十分优秀!