4

次のように設定されたテーブルがあります。

  +----+-------+-------+
  | 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 に表示されないため、これら 2 つのカウントを結合する方法を理解するのに苦労しています。

4

4 に答える 4

4

I'm assuming you could have more cases than you show in the data. You could have NULLs in col1, you could have names that occur only in col1 or only in col2, etc.

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;

Explanation:
The derived table a is a union of all names that appear in either column. Then make two more derived tables, one with each each name from col1 and the count of how many times it occurs, and then another similar derived tale for names in col2.

于 2012-11-18T02:01:14.003 に答える
1
select coalesce(a.col1,b.col2) names, a.c col1, b.c col2 from
(select col1, count(*) c from table1 group by col1) a
left outer join
(select col2, count(*) c from table1 group by col2) b
on a.col1 = b.col2;

actually it would need to be a full outer join to include names that only exist in col2 - since MySQL doesn't support full outer joins you have to first union them together as in Bill's answer.

于 2012-11-18T01:58:25.913 に答える
1

これを試して:

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;

SQL フィドルのデモ

于 2012-11-18T01:53:57.727 に答える
1

これも解決策になる可能性があります。

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

2 つの元のクエリを 1 つに結合しているだけです。

最初のものは、col1 の一意の値をカウントするので、col2 のカウントとして 0 を設定しています。2 つ目は、col2 の一意の値をカウントするため、col1 のカウントとして 0 を設定しています。ユニオン クエリはこれら 2 つのクエリを結合するため、結果をグループ化して合計するだけです。結合が含まれていないため、このソリューションは高速である必要があると思います。

于 2012-11-18T09:02:55.033 に答える