고수님들의 조언부탁드릴께요^^ 0 14 549

by 날아라! [MySQL] [2018.06.07 10:55:27]


안녕하세요.

현재 몰인몰 관련 프로그램을 진행중에 있습니다.

작업을 하다 막히는 부분이 있어서..고수님들께 조언을 구하고자 합니다.

SELECT * FROM bbs  WHERE code = 'notice'

간단하게 위와같은 전체공지 쿼리문이 있다고 할때 전체공지는 모두 보이면서  특정 입점업체에 개별적으로 공지한 리스트까지 보이게 하려면 어떻게 해야되는지

고수님들의 조언좀 부탁드립니다.

머릿속에서는 계속 구현방법이 될듯말듯하는데 실질적으로 구현하려고 하니 막히네요 ㅡㅡ

셀프조인을 해야되는것인지, 서브쿼리를 해야되는것인지 ㅡㅡ

 

by 아발란체 [2018.06.07 11:01:48]

A업체에게 개별적으로 공지한 글이 있고,

A업체가 로그인 했을 때 A업체 경우 개별 공지까지 보여야 하는 상황이라면

A업체에게 개별 공지한 근거가 무엇인지 단서가 좀 더 필요해 보입니다.


by 날아라! [2018.06.07 11:09:16]

답변감사합니다.

근거라 하심은 필드값을 말씀하시는것인지 모르겠는데요.
A업체의 아이디는 MALL_ID라고 칭한다면

SELECT * FROM bbs  WHERE code = 'notice' AND MALL_ID='aaa'

위와 같은 형태가 됩니다.


by 아발란체 [2018.06.07 11:13:58]

아.. 그렇다면

A업체가 로그인 했을 때 로그인 세션 정보에 "aaa" 값을 가지고 있을 것 같습니다.

그 값을 바인딩한다면 다음 형태가 될 것 같습니다.

SELECT * FROM bbs  WHERE code = 'notice' OR mall_id = IFNULL( #{login_mall_id}, mall_id )


by 날아라! [2018.06.07 11:31:27]

아발란체님 신경써주셔서 감사합니다.
알려주신 방법으로 시도해 보았으나 제가 원하는 결과물이 안나오네요 ㅡㅡ

제가 잘못 인지하고있는것인지...

관리자가 특정입점업체 예를 들어 mall_id = 'aaa'에 공지를 남기게되면

aaa로 로그인했을때 전체공지 + aaa에게 남긴공지가 보여져야하는데 전부 노출이되네요.

또한 bbb라는 아이디로 로그인했을때 개별공지가 없기에 전체공지만 노출되어야하는데 이것또한 전체(aaa에게 개별공지한 내용포함)가 보이구요.

아!!. 쉬운듯 하면서도 어렵네요^^ 제가 어렵게 생각하는것인지....

신경써주셔서 감사합니다. 좀더 방법을 생각해보아야 겠네요..


by 마농 [2018.06.07 12:19:23]

두가지 조건이 한번에 보여야 한다면? 조건을 OR 로 묶어주면 됩니다.
다른 방법을 찾아볼게 아니라. 해당 방법을 연구해 보세요.
OR 를 사용하는게 문제가 아니라 OR 를 잘못 사용한 듯 합니다.
OR 조건 사용할때는 괄호에 유의해야 합니다.
적용하신 쿼리를 보여주세요.


by 날아라! [2018.06.07 12:56:58]

마농님 안녕하세요.

적용한 쿼리문은 아래와같습니다.

SELECT a.*  FROM bbs AS a
 WHERE a.code = 'notice' OR a.mall_id in (select b.mall_id from bbs b where a.mall_id = b.mall_id and b.mall_id ='aaa')  

 


by 마농 [2018.06.07 13:06:53]

서브쿼리가 불필요해 보입니다. 서브쿼리 없이 바로 조건 주시면 됩니다.
다만, 서브쿼리 때문에 원치 않는 결과가 나오는 건 아닐 것 같습니다.
조건절 두개를 OR 로 처리했으니 OR 사용에 문제는 없습니다.
그렇다면 조건 자체가 문제가 있는게 아닐까요?
전체공지 조건과, 개별공지 조건이 명확한지 다시 한번 확인해 보세요.
각 조건별로 각각 따로 따로 쿼리 작성해서 결과가 맞는지 확인해 보세요.

아니면? 올려주신 쿼리가 전체 쿼리가 아닌 일부만 발췌한 것은 아닐런지요?


by 날아라! [2018.06.07 13:26:41]

답변감사합니다.^^

위에 올린 소스가 전부입니다.^^


by 마농 [2018.06.07 13:35:40]

각각의 조건절이 정확한지도 확인해 주세요.
  1. 전체 공지 : code = 'notice'
  2. 개별 공지 : mall_id = 'aaa'


by 아발란체 [2018.06.07 13:27:50]

뭔가 이상하네용~ @.@)

어려운 문제는 아닌 것 같은데

빠르고 정확한 답변을 위해서는 샘플 데이타셋을 올려주시면 아마 바로 원하시는 답변이 달릴 것 같아요!


전체공지와 aaa에게 남긴공지만 보여져야 한다는 단서만 보면
a.code = 'notice' OR a.mall_id = 'aaa' 식으로 풀이가 될 것 같은데.. 뭔가 다른게 있을 것 같습니다.


by 날아라! [2018.06.07 13:45:35]

많은 관심 가져주셔서 감사합니다.
마농님과 아발란체님의 말씀을 다시 읽어보니... 개별공지 및 전체공지에 대한 조건이 빠진듯합니다.

마농님의 말씀처럼 서브궈리문의 불필요하다하여 약간수정을 했는데도..결과는 변함이 없네요 ㅡㅡ

P : 개별공지

A : 전체공지

SELECT a.* FROM bbs as a WHERE a.code = 'notice' OR ((a.noticeType = 'P' OR a.noticeType = 'A') AND a.mall_id = 'aaa')

 


by 아발란체 [2018.06.07 13:51:35]

그렇다면~ 찍어서~ 

SELECT a.* FROM bbs as a WHERE (a.code = 'notice' AND a.noticeType = 'A') OR (a.mall_id = 'aaa' AND a.noticeType = 'P')


by 마농 [2018.06.07 13:52:16]
-- 1. 전체 공지
SELECT *
  FROM bbs
 WHERE code = 'notice'
   AND noticeType = 'A'
;
-- 2. 개별 공지
SELECT *
  FROM bbs
 WHERE code = 'notice'
   AND noticeType = 'P'
   AND mall_id = 'aaa'
;
-- 3. 전체공지 + 개별공지
SELECT *
  FROM bbs
 WHERE code = 'notice'
   AND ( noticeType = 'A' OR (noticeType = 'P' AND mall_id = 'aaa') )
;

-- AND 는 곱하기(*), OR 는 더하기(+) 라고 생각하시면 됩니다.
-- 사칙연산에서도 + 와 * 가 같이 쓰일 때 괄호에 따라 결과가 달라지듯이
-- OR 조건을 사용할 때는 괄호에 유의해야 합니다.
-- 각 쿼리의 공통 조건은 AND 로 빼고
-- 개별 조건은 괄호 안에서 OR 로 묶어준다.

 


by 날아라! [2018.06.07 14:12:11]

감사합니다. 많은 도움되었습니다...^^

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