2013-09-29 39 views
0

我有一个表visits这样加入:MySQL的计数2列在一排,并与另一个查询

+--------------+-------------+------+-----+---------------------+----------------+ 
| Field  | Type  | Null | Key | Default    | Extra   | 
+--------------+-------------+------+-----+---------------------+----------------+ 
| id   | int(11)  | NO | PRI | NULL    | auto_increment | 
| vis_id  | int(11)  | NO |  | NULL    |    | 
| unit   | int(11)  | NO |  | NULL    |    | 
| time_in  | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
| time_out  | timestamp | NO |  | 0000-00-00 00:00:00 |    | 
| in_username | varchar(16) | NO |  | NULL    |    | 
| out_username | varchar(16) | NO |  | NULL    |    | 
+--------------+-------------+------+-----+---------------------+----------------+ 

和一张桌子users这样的:

+------------+-------------+------+-----+---------------------+----------------+ 
| Field  | Type  | Null | Key | Default    | Extra   | 
+------------+-------------+------+-----+---------------------+----------------+ 
| id   | int(11)  | NO | PRI | NULL    | auto_increment | 
| fname  | varchar(32) | NO |  | NULL    |    | 
| lname  | varchar(32) | NO |  | NULL    |    | 
| date_added | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
| username | varchar(16) | NO |  | NULL    |    | 
| password | varchar(40) | NO |  | NULL    |    | 
| auth_level | int(1)  | NO |  | 1     |    | 
| last_login | timestamp | NO |  | 0000-00-00 00:00:00 |    | 
+------------+-------------+------+-----+---------------------+----------------+ 

我希望能够到请计算每个用户有多少次in_usernameout_username ...我以前使用的查询是这样的:

select count(*) as "count", u.fname as "fname" 
    from visits v 
     inner join users as u on u.username = v.in_username 
    group by u.username order by u.fname 

但是,只有返回许多in_username的有...我想如何在相同的查询,如果可能有两个,所以我可以得到的结果是这样的:

+----------+-----------+----------+ 
| count_in | count_out | fname | 
+----------+-----------+----------+ 
|  118 |  224 | Bo  | 
|  27 |  64 | James | 
|  147 |  138 | Jeremy | 
|  23 |  37 | Jim  | 
|  182 |  172 | Robert | 
|  120 |  158 | Tom  | 
+----------+-----------+----------+ 

count_in是他们的用户名多少次出现在visits.in_username,并且count_out是他们的用户名多少次出现在visits.out_username

一切我已经与UNION试图似乎计数加在一起,或出于某种原因删除行。有任何想法吗?

回答

1

做一个子查询得到每个总和,将它们与UNION合并,然后将它们与SUM()合并。

SELECT SUM(count_in) count_in, SUM(count_out) count_out, fname 
FROM (SELECT COUNT(*) count_in, 0 count_out, in_username fname 
     FROM visits v 
     GROUP BY fname 
     UNION 
     SELECT 0 count_in, COUNT(*) count_out, out_username fname 
     FROM visits v 
     GROUP BY fname) combined 
+0

非常好,这正是我需要的......我之前没有见过'combined',是一个MySQL关键字吗? – jmd9qs

+1

子查询需要有别名,就是这样。 – Barmar

相关问题