안녕하세요! 질문하나있어서... 다시금 질문글 올립니다 ...ㅠ '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
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) 하시면 됩니다.
조인된 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 ;