source

MySQL Count Distinent 값 여러 열의 동일한 행

nicesource 2022. 11. 15. 21:39
반응형

MySQL Count Distinent 값 여러 열의 동일한 행

MySQL은 처음이라서 요즘 가지고 놀아요.지난 며칠간 제가 해온 이 문제를 누군가 해결해 줄 수 있는지 보러 왔습니다.기본적으로 다음과 같은 표가 있습니다.

+------+----------+---------+----------+---------+
| City | Animal1  | Animal2 | Animal3  | Animal4 |
+------+----------+---------+----------+---------+
| ACY  | Lion     | Giraffe | Elephant | Gorilla |
| AMS  | Elephant | Gorilla | Gorilla  | Lion    |
| ATL  | Tiger    | Tiger   | Lion     | Tiger   |
| BYU  | Elephant | Tiger   | Elephant | Lion    |
| QNB  | Lemur    | Tiger   | Lemur    | Gorilla |
+------+----------+---------+----------+---------+

난 같은 동물이 3개 이상 있는 도시만 따돌릴 수 있는 논리를 찾고 있어.이 경우 애틀랜타에서 세 명의 타이거와 함께

+------+----------+---------+----------+---------+
| City | Animal1  | Animal2 | Animal3  | Animal4 |
+------+----------+---------+----------+---------+
| ATL  | Tiger    | Tiger   | Lion     | Tiger   |
+------+----------+---------+----------+---------+


mysql> SELECT count(DISTINCT Animal1,Animal2,Animal3,Animal4) FROM zooAnimal;
+-------------------------------------------------+
| count(DISTINCT Animal1,Animal2,Animal3,Animal4) |
+-------------------------------------------------+
|                                               5 |
+-------------------------------------------------+  

DISTINT와 GROUP BY와 함께 놀고 있었지만, 아무 행운도 없었습니다.

테이블을 정상화해야 합니다.테이블 구조가 존재하기 때문에 테이블을 쿼리하기 어렵고 비효율적입니다.

다음과 같은 쿼리를 사용하여 얻을 수 있다고 말한 바 있습니다.City동일한 동물을 3개 이상 포함하는 코드:

SELECT DISTINCT City
FROM (
   SELECT City, Animal1 AS Animal
   FROM mytable

   UNION ALL

   SELECT City, Animal2 AS Animal
   FROM mytable

   UNION ALL

   SELECT City, Animal3 AS Animal
   FROM mytable

   UNION ALL

   SELECT City, Animal4 AS Animal
   FROM mytable
) AS t
GROUP BY City, Animal
HAVING COUNT(*) >= 3

편집: 사용할 수 있는 2 + 2개의 일치 레코드를 얻으려면;

SELECT City
FROM (
   SELECT City, Animal
   FROM (
      SELECT City, Animal1 AS Animal
      FROM mytable

      UNION ALL

      SELECT City, Animal2 AS Animal
      FROM mytable

      UNION ALL

      SELECT City, Animal3 AS Animal
      FROM mytable

      UNION ALL

      SELECT City, Animal4 AS Animal
      FROM mytable
   ) AS t
   GROUP BY City, Animal
   HAVING COUNT(*) >= 2) AS x
GROUP BY City
HAVING COUNT(*) >= 2

(크로스 조인을 사용하여) 언포팅 트릭을 사용하여 테이블을 언포팅한 후 다음과 같이 집약을 수행할 수 있습니다.

select
    city,
    animal
from (
    select
        t.city,
        case x.i
            when 1 then Animal1
            when 2 then Animal2
            when 3 then Animal3
            when 4 then Animal4
        end animal
    from your_table t
    cross join (
        select 1 i union all
        select 2 i union all
        select 3 i union all
        select 4 i
    ) x
) t group by city, animal
having count(*) >= 3;

이 쿼리는 테이블을 한 번만 읽습니다.

또한, 당신의 디자인을 고치는 것이 훨씬 나을 것이다. 즉, 각각의 동물을 따로 일렬로 두는 것이다.

언급URL : https://stackoverflow.com/questions/42163503/mysql-count-distinct-value-multiple-column-same-row

반응형