질문/조언질답게시판
Extra Form
PHP PHP 7.0
CMS XpressEngine

월간 추천수(voted_count)가 가장많은 순서대로 5개의 도큐먼트를 추출하되, 중복회원(member_srl)의 게시물은 1건만 추출하고자 아래와 같은 sql 문을 작성하였습니다.

 

select * FROM `xe_documents` as documents where module_srl in (154) and  regdate like '$year$m%' group by member_srl order by voted_count desc limit 5;

 

의도한 대로 나오긴 했지만 중복회원(member_srl)이 있는경우 그사람의 게시물중 가장 추천수(voted_count)가 많은 게시물이 나오게 하고싶어서 아래와 같이 수정하였습니다.

 

select * FROM (select * from xe_documents as documents order by voted_count desc) group by member_srl where module_srl in (154) and regdate like '$year$m%' limit 5;

 

그러나 화면에 뿌려지는건 아무것도 없네요 ㅠ

어디가 잘못된건지요?

 

 

  • profile

    group by를 제외한 나머지 조건들은 서브쿼리 안으로 들어가야 할 것 같습니다만...

     

    정확히 무슨 오류가 있는지는 DB에서 반환하는 에러메시지를 확인해 보세요. 최근 버전의 MySQL에서는 저런 식으로 SELECT * 하면서 특정 컬럼에만 group by를 넣는 것을 지원하지 않는 추세인데, 그것 때문일 수도 있습니다.

     

    기존 쿼리를 건드리지 않고 좀더 쉽게 해결하는 방법으로는... 5개가 아니라 좀더 넉넉하게 받아온 후, 회원번호가 중복되는 것을 삭제하는 로직은 PHP단에서 구현하셔도 됩니다. 모든 것을 SQL로 구현할 필요는 없으니까요.

  • profile profile
    기진곰님 감사합니다.
    말씀하신대로 아래처럼 구문을 적용 해 봐도 마찬가지로 반응이 없네요.
    두번째로 말씀하신 php 단에서.... 이건 제 능력 밖이라서 안타깝습니다

    $sql="select * FROM (select * from xe_documents as documents order by voted_count desc where module_srl in (154) and regdate like '$year$m%' limit 5) group by member_srl";
  • profile profile
    select * from (select * from xe_documents where module_srl in (154) and regdate like '$year$m%' order by voted_count desc) as documents group by member_srl limit 5;

    이렇게 해보세요.
  • profile profile
    말씀대로 해봤는데 높은 추천수 순으로 출력이 되질않고 뒤죽박죽이 되어 버리네요,
    추천수기준 99,98,98,95,94... 이런 순서가 되어야하는데
    95,48,52,86.. 이렇게 출력됩니다.
  • profile
    Group by를 하고, 컬럼명 지정 안했는데 정상적으로 출력이 되나요...?
  • profile

    Select * from xe_documents where ('document_srl', 'voted_count') in (select document_srl, max(voted_count) FROM `xe_documents` as documents where module_srl in (154) and regdate like '$year$m%' group by document_srl, member_srl order by voted_count desc limit 5);

     

    모바일이라 문법은 조금 틀렸을수도 있는데, in으로 한번 해보셔요. 

  • profile profile
    답글 감사합니다.
    새로운 방식 인것 같은데 이것도 안되네요 ㅠ