2017-06-28 74 views
1

我有連接表的問題,這些表與其他表沒有關係。MYSQL連接表和範圍

表結構

用戶

╔════╦═════════════╗ 
║ 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

'SUM'不能在'join'中使用。 「水平」與其他兩張桌子有什麼關係? – Blank

+0

你不能在任何我曾經使用過的數據庫中加入SUM的結果。 –

+0

關卡表與任何其他表之間沒有關係。 – Ahmed

回答

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

如果您確實需要在一次通話中完成此操作,以下方法可能會使您開始朝正確的方向發展。

基本上,解決方案是從派生表中進行選擇並加入。

我還沒有去測試它,所以可能會有語法錯誤。

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