【问题标题】:MYSQL JOIN query to group user skills for conditional countMYSQL JOIN 查询为条件计数分组用户技能
【发布时间】: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。

标签: mysql join group-by


【解决方案1】:

此查询应为您提供所需的结果。 JOINs tbl_orderstbl_users,然后 LEFT JOINs 到 tbl_signature。不匹配或没有签名的 tbl_signature 行将不计入该订单的计数中:

SELECT u.skill,
       COUNT(o.id) AS total_count,
       COUNT(s.signature) AS attended_users_count,
       SUM(o.price) AS amount
FROM tbl_orders o
JOIN tbl_users u ON u.id = o.user_id
LEFT JOIN tbl_signature s ON s.item_id = o.item_id AND s.user_id = u.id
WHERE o.item_id = 1
GROUP BY u.skill

输出:

skill   total_count attended_users_count    amount
A       3           2                       300
B       1           0                       100

Demo on dbfiddle

【讨论】:

  • 站点注释:@Jobz 如果您将来需要更改此查询并且需要从tbl_signature s 表/别名中过滤信息,请不要将条件放在WHERE 中,像这样WHERE o.item_id = 1 AND s.columns = 1 这会给你无效的结果(而不是 INNER JOIN),非 NOT IS NULL 过滤条件,如 LEFT JOIN 表/别名上的 = 需要在 ON 子句中添加 AND。 ..这很容易出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多