MySQL对两列上的唯一值进行计数,并将每列的计数相加
我有一个如下设置的表:MySQL对两列上的唯一值进行计数,并将每列的计数相加,mysql,sql,left-join,outer-join,jointable,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 | +----+-------+-------+ +-------+--
+----+-------+-------+
| id | col1 | col2 |
+----+-------+-------+
| 1 | John | Mike |
| 2 | Mike | John |
| 3 | Marty | John |
| 4 | Walt | Marty |
| 5 | Walt | Mike |
+----+-------+-------+
+-------+-------+------+
| names | col1 | col1 |
+-------+-------+------+
| John | 1 | 2 |
| Marty | 1 | 1 |
| Mike | 1 | 2 |
| Walt | 2 | NULL |
+-------+-------+------+
我基本上希望计算col1和col2中的唯一值,并将它们与相应的唯一值一起显示。问题是col1不一定包含col2拥有的所有相同名称,反之亦然。我希望将其设置为这样:
+----+-------+-------+
| id | col1 | col2 |
+----+-------+-------+
| 1 | John | Mike |
| 2 | Mike | John |
| 3 | Marty | John |
| 4 | Walt | Marty |
| 5 | Walt | Mike |
+----+-------+-------+
+-------+-------+------+
| 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;
或
但我很难理解如何将这两个计数相加,特别是因为这里的值“Walt”没有出现在col2中。试试这个:
SELECT
t1.col1,
count(t2.col2),
COUNT(t1.col2)
FROM table1 t1
LEFT JOIN
(
SELECT col2
FROM Table1
) t2 ON t1.col1 = t2.col2
GROUP BY t1.col1;
实际上,它需要是一个
完全外部联接
来包含只存在于col2中的名称-因为MySQL不支持完全外部联接,所以您必须首先将它们合并在一起,如Bill的回答所示。我假设您可能有比数据中显示的更多的事例。在col1中可以有空值,也可以有只出现在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中的名称创建另一个类似的派生表。这也可能是一个解决方案:
select names, sum(totalc1), sum(totalc2)
from
(select col1 as names, count(col1) as totalc1, 0 as totalc2
from your_table group by col1
union
select col2 as names, 0 as totalc1, count(col2) as totalc2
from your_table group by col2) t
group by names
我只是将您的两个原始查询合并为一个
第一个计算col1中的唯一值,因此我将0设置为col2的计数。第二个计算col2中的唯一值,因此我将0设置为col1的计数。联合查询将这两个查询组合在一起,因此我们现在只需对结果进行分组和求和。由于不涉及连接,我认为这个解决方案应该很快。谢谢,我已经为此绞尽脑汁好一阵子了。你的解释清楚明了。