MySQL 선택 / NULL 손실 시 그룹화
다음 두 개의 테이블이 있습니다.
> select * from t1;
+-------+-------+
| text1 | text2 |
+-------+-------+
| a | NULL |
| b | c |
| d | e |
+-------+-------+
> select * from t2;
+-------+-------+-------+
| text1 | text2 | value |
+-------+-------+-------+
| a | NULL | 1 |
| a | NULL | 2 |
| a | NULL | 3 |
| b | c | 1 |
| b | c | 2 |
| d | e | 3 |
| f | g | 1 |
+-------+-------+-------+
제가 하려는 것은 두 테이블을 함께 접합하는 것입니다.value
각각에 대해서text1,text2
에 포함되는 조합t1
.
다음은 지금까지의 질문이며, 그 결과는 다음과 같습니다.
> select text1, text2, min(value)
> from t1
> natural join t2
> group by text1, text2
> order by text1 asc;
+-------+-------+------------+
| text1 | text2 | min(value) |
+-------+-------+------------+
| b | c | 1 |
| d | e | 3 |
+-------+-------+------------+
그래서 내가 필요한 건 거의 맞지만, 보다시피, 난 점점 더 많은 걸 잃어가고 있어.a
그 이유는text2
이NULL
예상되는 결과는 다음과 같습니다.
+-------+-------+------------+
| text1 | text2 | min(value) |
+-------+-------+------------+
| a | NULL | 1 |
| b | c | 1 |
| d | e | 3 |
+-------+-------+------------+
그럼 내 질문의 어떤 점이 문제일까?NULL
가치관?
주의:t2
다른 조합이 있을 수 있다text1
그리고.text2
,예.('a','z')
내 결과에 원하지 않는, 그래서 내가 둘 다 가진 이유text1
그리고.text2
내 안에서GROUP BY
절을 클릭합니다.적어도, 나는 그것을 목표로 하고 있다(분명히 내가 원하는 대로 작동하지 않는 것이 분명하다).
참고로 MariaDB 버전 10.3.8을 사용하고 있습니다.
와의 결합을 시도합니다.<=>
null safe 연산자.
SELECT t1.text1,
t1.text2,
min(t2.value)
FROM t1
INNER JOIN t2
ON t2.text1 <=> t1.text1
AND t2.text2 <=> t1.text2
GROUP BY t1.text1,
t1.text2
ORDER BY t1.text1 ASC;
현재 가지고 계신 내용은 다음과 같습니다.
SELECT t1.text1,
t1.text2,
min(t2.value)
FROM t1
INNER JOIN t2
ON t2.text1 = t1.text1
AND t2.text2 = t1.text2
GROUP BY t1.text1,
t1.text2
ORDER BY t1.text1 ASC;
그리고...NULL = NULL
null이 있는 행이 일치하지 않으므로 결과가 되지 않습니다.
를 사용할 수 없습니다.NATURAL JOIN
또는USING()
여기서 NULL-safe 연산자를 사용합니다.<=>
대신 'ON' 절에 추가되어 있습니다.NULL <=> NULL
로.1
,하는 동안에NULL = NULL
이NULL
:
select t1.text1, t1.text2, min(value)
from t1
join t2
on t2.text1 = t1.text1
and t2.text2 <=> t1.text2
group by t1.text1, t1.text2
order by t1.text1 asc;
데모: http://sqlfiddle.com/ #!9/3ca2a1/1
생각합니다natural join
문제가 있다
내추럴 조인(Natural Join)은 INSER JOIN의 변형으로 조인 조건이 양쪽 테이블의 공통 컬럼에 암묵적으로 포함되어 있습니다.당신의 경우 Natural Join의 쿼리는 다음과 같이 쓸 수 있으며, A와 B의 조회를 시도하기 때문에 어떠한 결과도 반환되지 않습니다.
select *
from table1
natural join table2
이하와 같이 Inner Join에서도 동일하게 기재할 수 있습니다.
select t1.*
from table1 t1
inner join table2 t2
on t1.text1 = t2.text1 and t1.text2 = t2.text2
언급URL : https://stackoverflow.com/questions/51658106/mysql-select-group-by-losing-nulls
'programing' 카테고리의 다른 글
어레이에서 스트림을 작성하려면 어떻게 해야 합니까? (0) | 2022.10.20 |
---|---|
JavaScript에서 임의의 영숫자 문자열? (0) | 2022.10.20 |
NumPy 다차원 배열의 ith 열에 액세스하려면 어떻게 해야 합니까? (0) | 2022.10.20 |
OkHttp 요청 대행 수신기에 헤더를 추가하는 방법 (0) | 2022.10.20 |
Vue를 사용하여 드롭다운을 채운 후 B 드롭다운에 구분선을 삽입하려면 어떻게 해야 합니까? (0) | 2022.10.20 |