MySQL计算两列的唯一值并为每列加入这些计数

标签 mysql sql left-join outer-join jointable

我有一个这样设置的表:

  +----+-------+-------+
  | id | col1  | col2  |
  +----+-------+-------+
  |  1 | John  | Mike  |
  |  2 | Mike  | John  |
  |  3 | Marty | John  |
  |  4 | Walt  | Marty |
  |  5 | Walt  | Mike  |
  +----+-------+-------+

我基本上想计算 col1 和 col2 中的唯一值,并将它们与适当的唯一值一起显示。问题是 col1 不一定包含 col2 具有的所有相同名称,反之亦然。我正在寻找这样的设置:

 +-------+-------+------+
 | names | col1  | col1 |
 +-------+-------+------+
 | John  |     1 |    2 |
 | Marty |     1 |    1 |
 | Mike  |     1 |    2 |
 | Walt  |     2 | NULL |
 +-------+-------+------+

我可以使用以下方法独立选择这些值:

  SELECT col1, count(col1) as count FROM example GROUP BY col1; 

  SELECT col2, count(col2) as count FROM example GROUP BY col2;

但我很难理解如何将这两个计数结合在一起,尤其是因为这里的值“Walt”没有出现在 col2 中。

最佳答案

我假设您的案例可能比数据中显示的更多。您可以在 col1 中使用 NULL,您可以使用仅出现在 col1 中或仅出现在 col2 中的名称,等等。

SELECT a.name, c1.`count`, c2.`count`
FROM (SELECT col1 AS name FROM `Table` UNION SELECT col2 FROM `Table`) a
LEFT JOIN (SELECT col1, COUNT(*) AS `count` FROM `Table` GROUP BY col1) c1 
  ON a.name = c1.col1
LEFT JOIN (SELECT col2, COUNT(*) AS `count` FROM `Table` GROUP BY col2) c2 
  ON a.name = c2.col2;

解释:
派生表 a 是出现在任一列中的所有名称的联合。 然后再创建两个派生表,一个包含来自 col1 的每个名称及其出现次数的计数,然后另一个类似的派生表包含 col2 中的名称。

关于MySQL计算两列的唯一值并为每列加入这些计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13436725/

相关文章:

mysql按顺序插入查找下一个

SQL 派生列调用号

php - 如何在php中存储大量数据?

mysql - 同一个表上的多个 LEFT JOIN 语句

mysql - (Mysql) 按日期时间范围合并两个表

java - 我的 Like Query JDBC(Derby) 有什么问题

postgreSQL中的SQL访问注释

Python/Sqlite3 : LEFT JOIN with GROUP_CONCAT

mysql - INNER JOIN + LEFT JOIN(双重过滤)

mysql - 删除字符串 = 由另一个字段分组的另一个记录的字符串末尾的记录