显示连锁结果的多选查询

时间:2013-09-04 11:30:23

标签: mysql

从表'phone_call'

SELECT * FROM phone_call;

*************************** 181. row ***************************
     id: 682
user_id: 24
  start: 2013-09-03 17:59:18
    end: 2013-09-03 17:59:20
ext_num: 2008
destination: 123473654172
call_id: 5eab044f19ed41d70661c3220f1b5c65
direction: I
created_at: 2013-09-03 17:59:18
updated_at: 2013-09-03 17:59:20
 totals: 1
*************************** 182. row ***************************
     id: 683
user_id: 22
  start: 2013-09-03 17:59:18
    end: 2013-09-03 17:59:20
ext_num: 2002
destination: 123456587458
call_id: 2eb1d9ea2e1937be30f1e93878eb3efe
direction: O
created_at: 2013-09-03 17:59:18
updated_at: 2013-09-03 17:59:20
 totals: 1
182 rows in set (0.00 sec)

...more

从上面的数据中,我需要一个返回的查询:

 ext_num, username, calls_in, calls_out, avg_in, avg_out 

从数据中,所有这些都在飞行中,但我正在挣扎一点。

我可以像这样得到各个部分:

SELECT AVG(timediff(end, start)) AS avg_in FROM phone_call WHERE user_id=24 AND  direction='I';
+---------------------------+
| avg_in                    |
+---------------------------+
| 22.0810810811             |
+---------------------------+
1 row in set (0.00 sec)

SELECT AVG(timediff(end, start)) AS avg_out FROM phone_call WHERE user_id=24 AND direction='O';
+---------+
| avg_out |
+---------+
|    NULL |
+---------+
1 row in set (0.00 sec)

此用户(24)没有“呼出”(direction ='O')。

SELECT ext_num, sum(totals) AS `calls_in`, u.username
FROM phone_call pc 
JOIN user u ON pc.user_id=u.id 
WHERE user_id=24 and direction='I';
+---------+----------+----------+
| ext_num | calls_in | username |
+---------+----------+----------+
|    2008 |       37 | Esi      |
+---------+----------+----------+
1 row in set (0.00 sec)

SELECT sum(totals) AS `calls_out`
FROM phone_call
WHERE user_id=24 and direction='O';
+-----------+
| calls_out |
+-----------+
|      NULL |
+-----------+
1 row in set (0.00 sec)

但是我怎么一起加入它来制作一个字符串或tupele?

编辑:我的表格结构:

describe phone_call;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id     | int(11)      | NO   | MUL | NULL    |                |
| start       | datetime     | YES  |     | NULL    |                |
| end         | datetime     | YES  |     | NULL    |                |
| ext_num     | int(11)      | YES  |     | NULL    |                |
| destination | varchar(45)  | YES  |     | NULL    |                |
| call_id     | varchar(100) | YES  |     | NULL    |                |
| direction   | varchar(1)   | YES  |     | NULL    |                |
| created_at  | datetime     | YES  |     | NULL    |                |
| updated_at  | datetime     | YES  |     | NULL    |                |
| totals      | int(1)       | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)

编辑:@Mahmoud 运行:

SELECT 
u.ext_num,
u.username,
AVG(CASE WHEN pc.direction = 'I' THEN timediff(pc.end, pc.start))  ELSE 0 END)AS avg_in,
AVG(CASE WHEN pc.direction = 'O' THEN timediff(pc.end, pc.start))  ELSE 0 END)AS avg_out,
sum(CASE WHEN pc.direction = 'I' THEN totals ELSE 0 END) AS `calls_in`, 
sum(CASE WHEN pc.direction = 'O' THEN totals ELSE 0 END) AS `calls_out`
FROM phone_call AS pc
JOIN user u ON pc.user_id=u.id 
WHERE u.user_id=24 
GROUP BY u.user_id, u.ext_num;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that     corresponds to your MySQL server version for the right syntax to use near ')  ELSE 0 END)AS avg_in,
AVG(CASE WHEN pc.direction = 'O' THEN timediff(pc.end' at line 4

2 个答案:

答案 0 :(得分:2)

您需要使用CASE表达式在一个查询中执行此操作,并为每列使用条件WHEN pc.direction = 'I'when pc.direction = 'O'

SELECT 
  u.ext_num,
  u.username,
  AVG(CASE WHEN pc.direction = 'I' THEN timediff(pc.end, pc.start) END)AS avg_in,
  AVG(CASE WHEN pc.direction = 'O' THEN timediff(pc.end, pc.start) END)AS avg_out,
  sum(CASE WHEN pc.direction = 'I' THEN totals ELSE 0 END) AS `calls_in`, 
  sum(CASE WHEN pc.direction = 'O' THEN totals ELSE 0 END) AS `calls_out`
FROM phone_call AS pc
JOIN user u ON pc.user_id=u.id 
WHERE u.user_id=24 
GROUP BY u.user_id, u.ext_num;

答案 1 :(得分:0)

这可能适合你!

 SELECT ext_num,  AVG(timediff(pc.end, pc.start)) as `avg_in`, NULL as `avg_out` , sum(totals) AS `calls_in`, NULL as `calls_out`, u.username
FROM phone_call pc JOIN user u ON pc.user_id=u.id 
WHERE user_id=24 and direction='I'
GROUP BY u.user_id, u.ext_num

UNION

SELECT ext_num, NULL as `avg_in`, AVG(timediff(pc.end, pc.start)) as `avg_out`, NULL AS `calls_in`, sum(totals) as `calls_out`, u.username
FROM phone_call pc 
JOIN user u ON pc.user_id=u.id 
WHERE user_id=24 and direction='O'
GROUP BY u.user_id, u.ext_num