首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从2个来源拉取信息并计数

从2个来源拉取信息并计数
EN

Stack Overflow用户
提问于 2014-11-10 21:53:36
回答 2查看 72关注 0票数 2

我被要求在工作中创建一个系统,记录通过我们的VoIP系统拨打和接收的电话数量。如果我能够改变数据源的结构,我可能已经做到了这一点,但在这种情况下,我不被允许改变它,这现在取决于我向比我更专业的人请教。

数据源1(使用MSSQL) -这将记录登录到我们的intranet的用户及其扩展名:

代码语言:javascript
复制
+-------+----------------+--------------+---------------------+
| ID    | USERNAME       | EXTENSION    | LOGGEDIN            |
+-------+----------------+--------------+---------------------+
| 1     | JESS           | 101          | 2014-11-10 12:00:00 |
+-------+----------------+--------------+---------------------+
| 2     | SARAH          | 203          | 2014-11-10 12:21:00 |
+-------+----------------+--------------+---------------------+
| 3     | FERN           | 124          | 2014-11-10 12:21:31 |
+-------+----------------+--------------+---------------------+
| 4     | SARAH          | 101          | 2014-11-10 13:12:00 |
+-------+----------------+--------------+---------------------+

数据源2(使用MySQL) -数据源2包含使用VoIP系统发出和接收的所有调用

代码语言:javascript
复制
+-------+----------------+---------------+---------------------+
| ID    | SRC            | DST           | TIME                |
+-------+----------------+---------------+---------------------+
| 1     | 101            | 02035654684   | 2014-11-10 12:01:00 |
+-------+----------------+---------------+---------------------+
| 2     | 203            | 02087816328   | 2014-11-10 12:22:00 |
+-------+----------------+---------------+---------------------+
| 3     | 124            | 02078939273   | 2014-11-10 12:23:31 |
+-------+----------------+---------------+---------------------+
| 4     | 101            | 04672738782   | 2014-11-10 13:15:00 |
+-------+----------------+---------------+---------------------+
| 5     | 07863522413    | 101           | 2014-11-10 13:21:00 |
+-------+----------------+---------------+---------------------+
| 6     | 02076352423    | 203           | 2014-11-10 13:25:31 |
+-------+----------------+---------------+---------------------+
| 7     | 07836325726    | 101           | 2014-11-10 13:56:00 |
+-------+----------------+---------------+---------------------+

这是我希望能够打印的内容:

代码语言:javascript
复制
+-------+----------------+--------------+--------------+-------------+
| ID    | USERNAME       | INCOMING     | OUTGOING     | TOTAL       |
+-------+----------------+--------------+--------------+-------------+
| 1     | JESS           | 0            | 1            | 1           |
+-------+----------------+--------------+--------------+-------------+
| 2     | SARAH          | 2            | 2            | 4           |
+-------+----------------+--------------+--------------+-------------+
| 3     | FERN           | 0            | 1            | 1           |
+-------+----------------+--------------+--------------+-------------+

从上面的表格中可以看到,Sarah从分机203开始,然后在Jess离开后登录到101。她在203登录时进行了1次呼叫,在101登录时进行了1次呼叫。她还在登录分机101时接听了2个呼叫。

我将在这个项目中使用PHP。理想情况下,我希望按总降序对上面的表进行排序,但我相信,一旦我有了构建块,我就可以自己解决这个问题。

提前感谢您在这方面能提供的任何帮助。

注意:我曾考虑创建一个临时表来拉取信息,但我已经被告知这不是一个好主意,因为查询的执行时间以及我需要拉取信息的频率。该脚本将每10秒运行一次,因此我使用的任何查询都需要非常精简。

EN

回答 2

Stack Overflow用户

发布于 2014-11-10 22:51:31

代码语言:javascript
复制
SELECT
   u.ID,
   u.USERNAME,
   coalesce(tSRC.INCOMING,0) as INCOMING,
   coalesce(tDST.OUTGOING,0) as OUTGOING,
   (coalesce(tSRC.INCOMING,0)+coalesce(tDST.OUTGOING,0)) as total
FROM
table1 u
LEFT JOIN (
   SELECT a.SRC as ext , count(a.ID) as INCOMING
   FROM table2 a WHERE CHAR_LENGTH(a.SRC)=3 GROUP BY a.SRC
   ) tSRC ON tSRC.ext = u.EXTENSION
LEFT JOIN (
   SELECT b.SRC as ext , count(b.ID) as OUTGOING
   FROM table2 b WHERE CHAR_LENGTH(b.DST)=3 GROUP BY b.DST
   ) tDST ON tDST.ext = u.EXTENSION

编辑:更好的版本:

代码语言:javascript
复制
SELECT
   u.ID,
   u.USERNAME,
   u.EXTENSION,
   COUNT(distinct a.ID) as INCOMING,
   COUNT(distinct b.ID) as OUTGOING,
   (COUNT(distinct a.ID)+COUNT(distinct b.ID)) as TOTAL
FROM
table1 u
LEFT JOIN table2 a ON u.EXTENSION=a.SRC
LEFT JOIN table2 b ON u.EXTENSION=b.DST
GROUP BY u.EXTENSION 
票数 0
EN

Stack Overflow用户

发布于 2014-11-11 02:37:29

代码语言:javascript
复制
$q1="SELECT USERNAME, EXTENSION, unix_timestamp(LOGGEDIN) as t FROM table1 WHERE 1 ORDER BY EXTENSION,LOGGEDIN";

$q2="
(SELECT SRC-0 as EXTENSION, 0 as side, unix_timestamp(`TIME`) as t FROM table2 WHERE CHAR_LENGTH(SRC)=3 )
UNION
(SELECT DST-0 as EXTENSION, 1 as side, unix_timestamp(`TIME`) as t FROM table2 WHERE CHAR_LENGTH(DST)=3 )
ORDER BY EXTENSION, t";


$r1 = $db1->query($q1);
$r2 = $db2->query($q2);

$x1 = $r1->fetch_object();
$x2 = $r2->fetch_object();

$users = array();

$future_x1 = $r1->fetch_object();

while($x1 && $x2)
{
    if( $x1->EXTENSION < $x2->EXTENSION )
    {
        $x1=$future_x1 ;
        $future_x1=$r1->fetch_object();
    }
    elseif( $x1->EXTENSION > $x2->EXTENSION )
    {
        $x2 = $r2->fetch_object();
    }
    elseif( $future_x1 && $future_x1->EXTENSION == $x1->EXTENSION && $x2->t >= $future_x1->t )
    {
        $x1=$future_x1 ;
        $future_x1=$r1->fetch_object();
    }
    else
    {
        @$users[$x1->USERNAME][$x2->side]++;
        $x2 = $r2->fetch_object();
    }
}

print_r($users);

这个解决方案假设您能够从PHP连接到这两个数据库,并且可以从两个表中读取几乎所有的行,并保存一个大小等于用户名数量的数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26845417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档