php - 从 2 个来源提取信息并计数

标签 php mysql sql sql-server database

我被要求在工作中创建一个系统来记录通过我们的 VoIP 系统调用和接听的电话数量。如果我能够更改数据源的结构,我可能会这样做,但在这种情况下,我不允许更改它,现在这取决于我询问比我更专业的人。

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

+-------+----------------+--------------+---------------------+
| 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 系统发出和接收的所有调用

+-------+----------------+---------------+---------------------+
| 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 |
+-------+----------------+---------------+---------------------+

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

+-------+----------------+--------------+--------------+-------------+
| 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。理想情况下,我想按总降序对上面的表格进行排序,但我相信一旦我有了构建 block ,我就可以自己解决这个问题。

在此先感谢您对此提供的任何帮助。

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

最佳答案

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

编辑:更好的版本:

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 

关于php - 从 2 个来源提取信息并计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26845417/

相关文章:

php - "Refresh cache"在 Magento 中是什么意思?

JavaScript 不工作(不显示警告框)

PHP opencart查询出数据

mysql - 无法理解 LIKE 行为

java - 如何使用java将当前日期和时间保存到数据库?

sql - 选择按日期分组的多个项目的计数

php - 在 MysQL 或 PHP 中将记录从一列拆分为两列

mysql - 处理 NULL 值的智能查询

mysql - mysql建表

php - 比较两行中的列,以及另一列的不同更改值