반응형
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
반응형
'source' 카테고리의 다른 글
v = (v == 0 ? 1 : 0 )로 표기하는 더 좋은 방법이 있습니까? (0) | 2022.11.15 |
---|---|
Jese Vue: [Vue 경고]:구성 요소를 마운트하지 못했습니다. 템플릿 또는 렌더링 함수가 정의되지 않았습니다.얕은 마운트 또는 마운트에 빈 html이 반환됩니다. (0) | 2022.11.15 |
printf()에서 0 뒤에 오는 것을 피합니다. (0) | 2022.11.15 |
VueJ에서 선택한 인덱스를 감지하는 방법 (0) | 2022.11.15 |
하나의 행만 선택하는 동안 총 행 번호 가져오기 (0) | 2022.11.15 |