Mysql 如何仅在单独表中的总和(字段)大于0时使用MAX标识最近的“字段”来选择记录

Mysql 如何仅在单独表中的总和(字段)大于0时使用MAX标识最近的“字段”来选择记录,mysql,select,sum,max,Mysql,Select,Sum,Max,我已经为这个问题争论了一天多了。我的SQL并不惊人,所以这可能解释了原因!无论如何,如果有人能澄清我在这里做错了什么,我将不胜感激 CREATE TABLE `business` ( `business_id` int(11) NOT NULL AUTO_INCREMENT, ) CREATE TABLE `business_unit` ( `business_unit_id` int(11) NOT NULL AUTO_INCREMENT, `business_id` int(1

我已经为这个问题争论了一天多了。我的SQL并不惊人,所以这可能解释了原因!无论如何,如果有人能澄清我在这里做错了什么,我将不胜感激

CREATE TABLE `business` (
  `business_id` int(11) NOT NULL AUTO_INCREMENT,
)

CREATE TABLE `business_unit` (
  `business_unit_id` int(11) NOT NULL AUTO_INCREMENT,
  `business_id` int(11) NOT NULL,
) 

CREATE TABLE `offer` (
  `offer_id` int(11) NOT NULL AUTO_INCREMENT,
  `business_unit_id` int(11) NOT NULL,
  `points_required` int(11) NOT NULL,
)

CREATE TABLE `points_balance` (
  `points_balance_id` int(11) NOT NULL AUTO_INCREMENT,
  `mobile_user_id` int(11) NOT NULL,
  `business_unit_id` int(11) NOT NULL,
  `points` int(11) NOT NULL DEFAULT '0',
  `record_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
)
数据将是:

INSERT INTO `business` (`business_id`) VALUES (1);
INSERT INTO `business` (`business_id`) VALUES (2);

INSERT INTO `business_unit` (`business_unit_id`,`business_id`) VALUES (11, 1);
INSERT INTO `business_unit` (`business_unit_id`,`business_id`) VALUES (12, 1);
INSERT INTO `business_unit` (`business_unit_id`,`business_id`) VALUES (13, 2);
INSERT INTO `business_unit` (`business_unit_id`,`business_id`) VALUES (14, 2);

INSERT INTO `offer` (`offer_id`,`business_unit_id`,`points_required`) VALUES (21, 11, 50);
INSERT INTO `offer` (`offer_id`,`business_unit_id`,`points_required`) VALUES (22, 12, 50);
INSERT INTO `offer` (`offer_id`,`business_unit_id`,`points_required`) VALUES (23, 12, 60);
INSERT INTO `offer` (`offer_id`,`business_unit_id`,`points_required`) VALUES (24, 13, 100);
INSERT INTO `offer` (`offer_id`,`business_unit_id`,`points_required`) VALUES (25, 14, 30);
INSERT INTO `offer` (`offer_id`,`business_unit_id`,`points_required`) VALUES (26, 14, 150);

INSERT INTO `points_balance` (`points_balance_id`,`user_id`,`business_unit_id`,`points`,`record_created`) VALUES (31, 27, 11, 10, '2013-04-01');
INSERT INTO `points_balance` (`points_balance_id`,`user_id`,`business_unit_id`,`points`,`record_created`) VALUES (32, 27, 11, 30, '2013-04-02');
INSERT INTO `points_balance` (`points_balance_id`,`user_id`,`business_unit_id`,`points`,`record_created`) VALUES (33, 27, 12, 10, '2013-03-02');
INSERT INTO `points_balance` (`points_balance_id`,`user_id`,`business_unit_id`,`points`,`record_created`) VALUES (34, 27, 12, 20, '2013-03-04');
INSERT INTO `points_balance` (`points_balance_id`,`user_id`,`business_unit_id`,`points`,`record_created`) VALUES (34, 27, 14, 20, '2013-04-12');
INSERT INTO `points_balance` (`points_balance_id`,`user_id`,`business_unit_id`,`points`,`record_created`) VALUES (34, 27, 14, 100, '2013-04-14');
点数余额表中的记录仅用于插入,因此用户的单位余额位于该用户/单位的最新记录上

同一业务部门内的业务部门共享积分余额,即用户的总积分是其在该业务部门内各个部门的积分之和

我想选择用户有足够积分兑换的优惠

SELECT up.user_id, up.points, o.*
FROM offer o
JOIN (
    SELECT user_id, business_id, sum(points) AS points 
    FROM points_balance pb
    JOIN business_unit bu on pb.business_unit_id = bu.business_unit_id
    WHERE pb.points_balance_id IN (
        SELECT MAX(pb2.points_balance_id)
        FROM points_balance pb2
        WHERE pb2.user_id = 27
        GROUP BY pb2.business_unit_id)
    GROUP BY user_id, business_id
) up ON up.points >= o.points_required
上面的查询返回的是同一报价的一个实例,其数量是用户所处业务数量的数倍:

我要寻找的结果集是:

谢谢大家。
G

这里有一个查询,可以满足您的要求:

select up.user_id, up.business_id, up.allpoints, o.*
from (select user_id, business_id, sum(points_balance) as allpoints
      from points_balance pb join
           business_Unit bu
           on pb.business_unit_id = bu.business_unit_id
      group by user_id, business_id
     ) up join
     offers o
     on o.point_required <= up.allpoints;
此查询背后的逻辑比您所采用的方法简单得多。第一个子查询计算用户在企业内所有业务部门的可用点数。然后找到匹配点

您可以在子查询或整个查询中添加where子句,以限制特定的业务或用户


此外,这是基于问题文本中的字段名,而不是查询中的字段名。它们是不同的。

当我在多个业务中兑换优惠时,我发现它返回了同一优惠的多个实例。所以问题是我没有将报价与具体业务联系起来!所以我在查询的底部添加了

JOIN business_unit bu ON bu.business_unit_id = o.business_unit_id
AND up.business_id = bu.business_id

排序:

首先,它需要彻底改造。永远不要写in子句,除非它类似于in 1、2、3之类的东西。我确信查询可以改进或完全重写!。关于您的评论,IN中的子查询的结果是一个以逗号分隔的ID列表。你的意思是,在IN中包含子查询不是个好主意吗?正确。在学习过程中,对于10行的表格很好。在那之后,它是缓慢的。然后你必须学习Join我认为你需要慢慢地查看你提供的数据和你想要的结果。我想这是一团糟。我看不出有什么不对劲。我想要的结果应该是来自用户所处业务部门的报价。“积分”列结果包含用户在每个企业的总积分,即各企业单位的积分总和。Thaks Gordon。我添加了WHERE子句来限制特定用户,结果看起来已经更好了。目前唯一的问题是报价被返回多次,例如,如果用户在5个业务中有积分,则每个报价都会返回*5。我认为我需要在某处设置另一个WHERE子句来阻止它。
JOIN business_unit bu ON bu.business_unit_id = o.business_unit_id
AND up.business_id = bu.business_id