我被要求在工作中创建一个系统来记录通过我们的 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/