【发布时间】:2019-02-20 12:15:47
【问题描述】:
我正在努力寻找使用 GROUP BY 进行 JOIN 查询的逻辑。
我有 3 张桌子。
1. tbl_users
2. tbl_event_orders
3.tbl_event_signature ( For saving signatures on completed events)
tbl_users
id name skill
---------------------------
1 user1 A
2 user2 B
3 user3 A
4 user4 A
tbl_orders
id user_id item_id price
------------------------------------
1 1 1 100
2 2 1 100
3 3 1 100
4 4 1 100
tbl_signature
id item_id user_id signature
----------------------------------------------
1 1 1 xxxxxxxx...
1 1 3 NULL
1 1 4 xxxxxxxx...
我需要项目 ID 中的事件详细信息。 例如对于 id 为 1 的项目,我需要以下结果。
skill total_count attended_users_count amount
A 3 2 300
B 1 0 100
skill - 来自用户表的技能。
total_count - 来自该特定技能的订单总数。
attended_users_count - 来自该特定技能的订单总数 + 这应该在 tbl_signature 表中有一个条目和一个 NOT NULL 值。
金额 - 价格总和(total_count)
我有以下查询来获取具有技能和总数的用户。
SELECT
U.skill as skill,
count(U.skill) as total_count,
sum( O.price ) as amount
FROM tbl_users U
INNER JOIN tbl_orders O
ON U.id = O.user_id
WHERE O.item_id = 1
GROUP BY U.skill
但是在处理参与的用户数时,我得到了意想不到的结果。 我已尝试使用以下查询,
SELECT
U.skill as skill,
count(U.skill) as total_count,
count( S.signature ) as attended_users_count,
sum( O.price ) as amount
FROM tbl_users U
INNER JOIN tbl_orders O
ON U.id = O.user_id
LEFT JOIN tbl_signature S
ON O.item_id = S.item_id
WHERE O.item_id = 1
GROUP BY U.skill
有没有办法在一个查询中得到这个?
【问题讨论】:
-
预期的结果是什么,你会得到什么结果?
-
count( S.signature ) as attended_users_count,计数LEFT JOIN tbl_signature S可以具有NULL值。COUNT(*)不计数NULL值。所以先试试COUNT(CASE WHEN S.signature IS NOT NULL THEN 1 ELSE 0 END) AS attended_users_count,看看能不能得到你需要的结果.. -
@RaymondNijland 我在问题中添加了预期结果。当使用 COUNT(CASE WHEN S.signature IS NOT NULL THEN 1 ELSE 0 END) AS Attend_users_count 时,我将 Attended_users_count 设为 9 和 3。