Mysql用户与自己相比

时间:2016-12-09 02:26:24

标签: php mysql

我正在尝试创建一个概述谁欠谁的电话时间。 在我的桌子下面。

Table example

因此用户2已经为用户1完成了9小时,但是用户1已经为用户2完成了3小时,因此来自用户1的总欠款是6小时。并且用户2在通话时间内欠用户3。如何从Mysql中的所有用户创建交叉引用表?

enter image description here

2 个答案:

答案 0 :(得分:1)

首先,这在SQL中不是很自然的事情。但这是可能的。要创建交叉引用表,您需要生成行,然后填充列:

select user_id_a,
       sum(case when user_id_b = 1 then hours_oncall else 0 end) as user_1,
       sum(case when user_id_b = 2 then hours_oncall else 0 end) as user_2,
       sum(case when user_id_b = 3 then hours_oncall else 0 end) as user_3
from ((select user_id_a from t
      ) union
      (select user_id_b from t
      )
     ) u left join
     t
     on t.user_id_a = u.user_id_a
group by u.user_id_a;

答案 1 :(得分:0)

在纯SQL中,您不能拥有可调整为用户数的动态列数,但在您的代码中,您可以生成执行此操作的SQL。但我认为你最好只是让行显示谁欠了多少小时,并像代码中的数据透视表一样转换数据。

要获取基本数据,假设您的表名为hours_oncall:

select ower,owed,sum(hours_oncall) hours
from (
    select user_id_a ower,user_id_b owed,hours_oncall from hours_oncall
    union all
    select user_id_b,user_id_a,-hours_oncall from hours_oncall
) hours_oncall_union
group by 1,2
having hours>0;

对于您的样本数据,返回:

+------+------+-------+
| ower | owed | hours |
+------+------+-------+
|    1 |    2 |     6 |
|    2 |    3 |     2 |
+------+------+-------+