gpt4 book ai didi

sql - MySQL 加入 WHERE 子句

转载 作者:行者123 更新时间:2023-11-29 02:37:17 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com