MYSQL连接表的总和范围

时间:2017-06-28 01:02:24

标签: mysql sql

我有加入表的问题,这些表与其他表没有关系。

表格结构

用户

╔════╦═════════════╗
║ ID ║ Name        ║
╠════╬═════════════╣
║ 1  ║ Jon         ║
║ 2  ║ Mark        ║
║ 3  ║ Tom         ║
╚════╩═════════════╝

机会

╔════╦════════════╦═════════════╗
║ ID ║ user_id    ║ total_price ║
╠════╬════════════╬═════════════╣
║ 1  ║ 2          ║ 1500        ║
║ 2  ║ 2          ║ 2000        ║
║ 3  ║ 1          ║ 1000        ║
╚════╩════════════╩═════════════╝

水平

╔════╦════════════╦═════════════╦══════════╦════════╗
║ ID ║ Name       ║ parent_id   ║ min      ║target  ║
╠════╬════════════╬═════════════╬══════════╬════════╣
║ 1  ║ Golden     ║      0      ║ 1000     ║  5000  ║
║ 2  ║ golden-1   ║      1      ║ 1000     ║  2500  ║
║ 3  ║ golden-2   ║      1      ║ 2551     ║  5000  ║
║ 4  ║ Silver     ║      0      ║ 500      ║  999   ║
║ 5  ║ Silver-1   ║      4      ║ 500      ║  750   ║
╚════╩════════════╩═════════════╩══════════╩════════╝

如果在mintarget等级范围内总计他的机会总价,我想获得用户级别 我尝试使用此查询,但它显示错误[HY000][1111] Invalid use of group function

 SELECT
  `users`.`id`                   AS `user_id`,
  `users`.`name`                 AS `user_name`,
  SUM(opportunities.total_price) AS `total_target`,
`levels`.`name`                  As `Level_name`
FROM `users`
  INNER JOIN `opportunities` ON `users`.`id` = `opportunities`.`user_id`
  INNER JOIN `levels` ON SUM(opportunities.total_price) >= levels.min
                         AND SUM(opportunities.total_price) <= levels.target
WHERE `users`.`deleted_at` IS NULL
GROUP BY user_id
  

注意:我使用的是Laravel 5.2

2 个答案:

答案 0 :(得分:2)

正如其他人已经在评论中指出的那样:你不能直接在连接中使用聚合函数。加入操作在聚合之前发生。

您需要在之前进行聚合 - 因此您需要计算子查询中的总和。这样,您可以将和作为连接中的普通字段引用。

select t.*, levels.name as level_name
from levels l
inner join
(SELECT
  `users`.`id`                   AS `user_id`,
  `users`.`name`                 AS `user_name`,
  SUM(opportunities.total_price) AS `total_target`
 FROM users
 INNER JOIN `opportunities` ON `users`.`id` = `opportunities`.`user_id`
 WHERE `users`.`deleted_at` IS NULL
 GROUP BY users.id, users.name) t on t.total_target>=l.min and t.total_target<=l.target

但是,我注意到你有一个等级的层次结构。上面的查询将在单独的记录中返回每个用户的主要和子级别。

答案 1 :(得分:1)

如果你真的需要在一次通话中完成,下面的内容可能会让你开始朝着正确的方向前进。

基本上,解决方案是从派生表中进行选择并加入到该表中。

我还没有对它进行测试,因此可能存在语法错误。

select
 c.`user_id`    `user_id`,
 c.`user_name`  `user_name`,
 c.total_target `total_target`,
 d.`Name`       `Level_name`
from
(select
 `id`             `user_id`,
 `name`           `user_name`,
 sum(total_price) `total_target`
from `users` a
join `opportunites` b
on a.ID = b.user_id
group by user_id) c
join levels d
on c.total_target >= d.min
 and c.total_target =< d.target