MySQL 计算一行中的 2 列并与另一个查询连接

标签 mysql sql join count union

我有一张 table visits像这样:

+--------------+-------------+------+-----+---------------------+----------------+
| 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_username 中的次数 out_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似乎将计数加在一起,或由于某种原因删除行。有什么想法吗?

最佳答案

执行子查询来获取每个总计,使用 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

关于MySQL 计算一行中的 2 列并与另一个查询连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19075337/

相关文章:

SQL - 选择仅满足特定条件的记录组

sql - 如何使用 PostgreSQL 在任何列中查找所有具有 NULL 值的行

python - 如何使用 Pandas 将多索引系列连接到单个索引数据框?

mysql - 如何在 Sql-server 中对按日期分组的时间求和

mysql - Entity Framework ,创建适用于 2 种数据库类型(Firebird 和 Mysql)的应用程序

mysql - MySQL表中的TableName.MYD.filepart文件是什么(myisam引擎)

php - 用一个sql查询选择两行

mysql - 在 SQL 中,可以对行条件指定限制吗?

android - SQLite 左连接 + 分组依据 + 排序依据

sql - Postgresql 从 2 个表中选择。加入?