mysql 'strict' => true 시 그룹바이 오류. 어떻게 고쳐야 될까요 ..? 0 4 690

by 마이닝 [MySQL] [2019.03.11 18:35:58]


이미지 18.png (15,443Bytes)


안녕하세요! 질문하나있어서... 다시금 질문글 올립니다 ...ㅠ
'strict' => false 로 사용하다가 true 로바꾸게되었어요.
그러면 MySQL 5.6 에서 MySQL 5.7 을 사용하게 된다고하더라구요. 
아래와같은 mysql 식 그룹바이쿼리문을 쓰고있었는데. 실제 그룹바이 하기전 데이터가 site_id 별 DEVICE_TYPE 이나 IEEE_ADDRESS 는 다똑같은 값이라 아래와 같이 해도 문제없이 결과가 나왔었거든요.
그외에 데이터가 다른값이긴하지만 이쿼리에서는 필요없는값..
그런데 'strict' => true 로 바꾸니까 그룹바이 형식이 잘못됬다고 에러가 나요..  
a.SITE_ID, b.DEVICE_TYPE, b.IEEE_ADDRESS  를 전부안써주고 a.SITE_ID 만 그룹으로 묶어서 그런것같은데
3개를 전부써버리면 필요하지않은 값들때문에 ?? 원래 283건만필요한데 10만건이 넘는 결과가 나오더라구요..
그렇다구 select 절에 max 나 min 을써서 하나만 뽑으면 모든 값들기준 최대,최소값으로 통일되서 데이터가 하나도안맞고..
이럴경우에 어떻게 쿼리를 바꿔서 원하는 283건만을 뽑을수있을까요..? 


select a.SITE_ID, b.DEVICE_TYPE, b.IEEE_ADDRESS,  
         count(case when b.DEVICE_TYPE = 4 then 1 end) SCOUNT 
        , count(case when b.DEVICE_TYPE = 2 then 1 end) LCOUNT 
        , count(case when b.DEVICE_TYPE = 1 then 1 end) CCOUNT 
from WL_DEVICE a, WL_DEVICE b
where a.SITE_ID = b.SITE_ID and a.IEEE_ADDRESS = b.IEEE_ADDRESS
group by a.SITE_ID

 

 

by 마농 [2019.03.12 09:34:08]

1. device_type 별로 카운트를 나누었으므로
  - device_type 을 조회하는 것은 무의미합니다.
  - SELECT 절에서 device_type 을 제거하세요.
2. 그룹 기준인 site_id 와 ieee_address 가 1:1 관계인 경우라면?
  - GROUP BY 에 ieee_address 를 추가하면 됩니다.
3. 그룹 기준인 site_id 와 ieee_address 가 1:M 관계인 경우라면?
  - GROUP BY 에 ieee_address 를 추가하면 결과가 달라지게 됩니다.
  - 추가하는게 맞는지? 빼는게 맞는지 확인하세요.
  - 빼는게 맞다면? Select 절에 ieee_address 를 조회하는 것은 논리적으로 맞지 않습니다.
  - site_id 별 여러개의 ieee_address 가 있는데 하나만 조회한다는게 말이 안되죠
  - 여러개의 값중 어떤 값을 조회해야 할지 명확하게 정하셔야 합니다.
  - 최소값을 원한다면 MIN(ieee_address) 하시면 됩니다.


by 마이닝 [2019.03.12 17:51:36]

그러네요 논리적으로 말이되지않네요 ... mysql에서 답이 그냥나오니 그렇구나 하고 생각한게 잘못된것같아요.. 다시 보겠습니다 감사합니다


by 마농 [2019.03.12 10:04:51]

조인된 a 와 b 가 같은 테이블 이네요? wl_device
같은 테이블 두번 쓰는게 맞는지 의문이네요? 결과가 이상할 듯 하네요.
한번만 쓰는게 맞을 듯 합니다.

SELECT site_id
     , ieee_address
     , COUNT(CASE WHEN device_type = 4 THEN 1 END) scount
     , COUNT(CASE WHEN device_type = 2 THEN 1 END) lcount
     , COUNT(CASE WHEN device_type = 1 THEN 1 END) ccount
  FROM wl_device
 GROUP BY site_id, ieee_address
;

 


by 마이닝 [2019.03.12 17:49:59]

아....  그렇..군요... 뭔가 정리가 잘못된상태로 작성을 했나봅니다. 

제가 머릿속에 쿼리가 엉켜있나봐요 .. 마농님 좋은 조언 늘 감사합니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입