我有三台电话服务器将其扩展的状态定期推送到MySQL中。这些系统在不同地理区域彼此重复,但具有根据需要进行故障切换的能力。因此,他们将报告相同的扩展名,但三个系统中只有一个会显示该扩展程序在任何时候都被注册(“OK”)。如何消除子查询来简化查询?
例如,表如下:
+----------------+---------+----------+
| extension name | status | systemid |
+----------------+---------+----------+
| 101 | OK | PBX01 |
| 101 | UNKNOWN | PBX02 |
| 101 | UNKNOWN | PBX03 |
| 202 | UNKNOWN | PBX01 |
| 202 | OK | PBX02 |
| 202 | UNKNOWN | PBX03 |
| 303 | UNKNOWN | PBX01 |
| 303 | UNKNOWN | PBX02 |
| 303 | OK | PBX03 |
| 404 | UNKNOWN | PBX01 |
| 404 | UNKNOWN | PBX02 |
| 404 | UNKNOWN | PBX03 |
+----------------+---------+----------+
所以伸出部101被注册到PBX01,202至PBX02,303〜PBX03,和404没有被注册到任何PBX。一次不能将分机注册到多个集团电话。
确定状态将是“最佳”状态,因此我希望报告,如果它存在。但是,如果有一个扩展名(如404)未注册到任何PBX,我也需要报告该事实。
我想要的输出:
+----------------+---------+----------+
| extension name | status | systemid |
+----------------+---------+----------+
| 101 | OK | PBX01 |
| 202 | OK | PBX02 |
| 303 | OK | PBX03 |
| 404 | UNKNOWN | |
+----------------+---------+----------+
我想出了以下查询它提供我想要的结果:
SELECT * FROM
(SELECT * FROM table
ORDER BY extension,status) AS dummytable
GROUP BY extension
但是这个查询是针对我的web应用程序太复杂。我希望用这个查询的结果创建一个视图,但是我不能在FROM子句中用子查询创建一个视图。
我试图创建两个视图:包含子查询之一:
SELECT * FROM table ORDER BY extension,status
和包含第二视图:
SELECT * FROM view1 GROUP BY extension
然而结果是无效的,因为它们似乎忽略了ORDER BY在厂景。
我也研究了一个存储过程,但是它不能与我的web应用程序一起工作。
任何想法?
为什么查询对于您的Web应用程序来说太复杂?无论如何,你是否可以将它封装在一个存储过程中并从你的应用程序调用它? – nycdan 2012-01-03 03:25:27
除非你确实需要,否则不要在MySQL中使用视图。查询优化器在处理它们时很糟糕,特别是一旦你开始加入它们。 – PlexQ 2012-01-03 03:28:55
您的查询不会保证输出。即使MySQL支持分析,它也需要派生表/内联视图。您的查询不是子查询... – 2012-01-03 03:33:47