我有加入表的问题,这些表与其他表没有关系。
表格结构
用户
╔════╦═════════════╗
║ 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 ║
╚════╩════════════╩═════════════╩══════════╩════════╝
如果在min
和target
等级范围内总计他的机会总价,我想获得用户级别
我尝试使用此查询,但它显示错误[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
答案 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