【发布时间】:2010-07-26 18:30:57
【问题描述】:
我有 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 美元的奖励,并以 5 美元从 B 公司购买了另一种产品(组外,所以 T.from_group=0 ) 并再次获得 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(这决定了用户是从组外交易还是从组内交易)、授权等。
我想分别过滤每个组中用户193的消费金额。
我现在了解了 JOINTS 概念,但我需要知道为什么第二个查询中的 t.from_group 被忽略?
【问题讨论】:
-
您必须发布一些演示问题的示例数据和输出,以及您期望的输出。请编辑您的问题并添加此信息。
-
我不知道它是否能解决您的问题,但您需要更好地了解左连接和 where 子句。这是特定于 SQL Server 的,但 saame 原则适用于所有数据库:wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN
-
您应该编辑您的原始帖子,而不是发布回复。此外,我们需要查看一些表模式。我不确定分组如何适应公司的分组。
标签: sql mysql phpmyadmin aggregate-functions