Mysql문 문의
본문
SELECT b.sno,b.regDt,b.modDt,b.groupNo,b.groupThread,b.writerNm,b.writerId,b.channel,b.writerNick,b.writerEmail,b.writerHp,b.subject,b.subSubject,b.urlLink,b.uploadFileNm,b.saveFileNm,b.writerPw,b.memNo,b.parentSno,b.writerIp,b.isNotice,b.isSecret,b.hit,b.memoCnt,b.category,b.writerMobile,b.goodsNo,b.goodsPt,b.orderNo,b.mileage,b.mileageReason,b.isDelete,b.recommend,b.replyStatus,b.eventStart,b.eventEnd,b.bdUploadStorage,b.bdUploadPath,b.bdUploadThumbPath,b.isMobile,b.answerSubject,b.answerContents,b.answerManagerNo,b.answerModDt,b.isShow,b.category2depth,b.brandcodes, b.contents as contents,g.goodsNm,g.scmNo,g.imageStorage,g.imagePath,g.brandCd,g.makerNm,g.originNm,g.onlyAdultFl,g.onlyAdultImageFl,g.goodsPrice FROM es_bd_TNBreview as b LEFT OUTER JOIN es_goods as g ON b.goodsNo = g.goodsNo WHERE 1 AND isNotice = ? AND (b.goodsNo = '0' OR (b.goodsNo > 0 AND (g.goodsAccess !='group' OR (g.goodsAccess='group' AND FIND_IN_SET('1', REPLACE(g.goodsAccessGroup,"||",","))) OR (g.goodsAccess='group' AND !FIND_IN_SET('1', REPLACE(g.goodsAccessGroup,"||",",")) AND g.goodsAccessDisplayFl ='y')))) AND isDelete = 'n' ORDER BY b.groupNo asc , groupThread LIMIT 0,3 SELECT b.sno,b.regDt,b.modDt,b.groupNo,b.groupThread,b.writerNm,b.writerId,b.channel,b.writerNick,b.writerEmail,b.writerHp,b.subject,b.subSubject,b.urlLink,b.uploadFileNm,b.saveFileNm,b.writerPw,b.memNo,b.parentSno,b.writerIp,b.isNotice,b.isSecret,b.hit,b.memoCnt,b.category,b.writerMobile,b.goodsNo,b.goodsPt,b.orderNo,b.mileage,b.mileageReason,b.isDelete,b.recommend,b.replyStatus,b.eventStart,b.eventEnd,b.bdUploadStorage,b.bdUploadPath,b.bdUploadThumbPath,b.isMobile,b.answerSubject,b.answerContents,b.answerManagerNo,b.answerModDt,b.isShow,b.category2depth,b.brandcodes, b.contents as contents,g.goodsNm,g.scmNo,g.imageStorage,g.imagePath,g.brandCd,g.makerNm,g.originNm,g.onlyAdultFl,g.onlyAdultImageFl,g.goodsPrice FROM es_bd_TNBreview as b LEFT OUTER JOIN es_goods as g ON b.goodsNo = g.goodsNo WHERE 1 AND isNotice = ? AND (b.goodsNo = '0' OR (b.goodsNo > 0 AND (g.goodsAccess !='group' OR (g.goodsAccess='group' AND FIND_IN_SET('1', REPLACE(g.goodsAccessGroup,"||",","))) OR (g.goodsAccess='group' AND !FIND_IN_SET('1', REPLACE(g.goodsAccessGroup,"||",",")) AND g.goodsAccessDisplayFl ='y')))) AND groupThread = '' AND isDelete = 'n' ORDER BY b.groupNo asc , ((g.fixedPrice - g.goodsPrice)/g.fixedPrice)*100 asc , groupThread LIMIT 0,4
으로 진한부분을 추가 시켰더니 작동을하지 않네요 어떻게 해야 할 까요?
답변 6
loop문을 돌리면 sql을 실행시키는거 같네요.
요런경우 다 이렇게 보시면 너무 양이 많고 복잡해보여서 1건만 돌려서 그부분만을 가지고 분석을 해야합니다. 그럼 나머지도 동일하니 해결이 될겁니다.
제가 쿼리 한개만 가지고 분석을 좀 해봤습니다.
SELECT b.sno
,b.regDt
,b.modDt
,b.groupNo
,b.groupThread
,b.writerNm
,b.writerId
,b.channel
,b.writerNick
,b.writerEmail
,b.writerHp
,b.subject
,b.subSubject
,b.urlLink
,b.uploadFileNm
,b.saveFileNm
,b.writerPw
,b.memNo
,b.parentSno
,b.writerIp
,b.isNotice
,b.isSecret
,b.hit
,b.memoCnt
,b.category
,b.writerMobile
,b.goodsNo
,b.goodsPt
,b.orderNo
,b.mileage
,b.mileageReason
,b.isDelete
,b.recommend
,b.replyStatus
,b.eventStart
,b.eventEnd
,b.bdUploadStorage
,b.bdUploadPath
,b.bdUploadThumbPath
,b.isMobile
,b.answerSubject
,b.answerContents
,b.answerManagerNo
,b.answerModDt
,b.isShow
,b.category2depth
,b.brandcodes
,b.contents as contents
,g.goodsNm
,g.scmNo
,g.imageStorage
,g.imagePath
,g.brandCd
,g.makerNm
,g.originNm
,g.onlyAdultFl
,g.onlyAdultImageFl
,g.goodsPrice
FROM es_bd_TNBreview as b LEFT OUTER JOIN es_goods as g ON b.goodsNo = g.goodsNo
WHERE 1
AND isNotice = ?
AND ( b.goodsNo = '0' OR ( b.goodsNo > 0 AND
(
g.goodsAccess !='group'
OR (g.goodsAccess='group' AND FIND_IN_SET('1', REPLACE(g.goodsAccessGroup,"||",",")))
OR (g.goodsAccess='group' AND !FIND_IN_SET('1', REPLACE(g.goodsAccessGroup,"||",",")) AND g.goodsAccessDisplayFl ='y')
)
)
)
AND isDelete = 'n'
ORDER BY b.groupNo asc, groupThread LIMIT 0,3
AND isNotice = ? <-- 이부분을 확인해보셔야할꺼 같습니다.
그리고 WHERE 의 AND조건문이 좀 복잡합니다. 이부분을 조금 단순화 시켜야 하지 않을까요?
SELECT
.......
.......
AND groupThread = ''
AND isDelete = 'n'
ORDER BY b.groupNo asc
, ((g.fixedPrice - g.goodsPrice)/g.fixedPrice)*100 asc <-- 추가된 부분
, groupThread LIMIT 0,4
((g.fixedPrice - g.goodsPrice)/g.fixedPrice)*100 asc 이부분을 추가 하신거 같은데 잘못하셨는데요?
필드 기준으로 정렬을 하려는 조건을 넣어야 하는데..계산을 해서 정렬을 하려고 하는게 동작이 안될꺼 같습니다.
!-->!-->
동작하지 않을때 나오는 에러를 보는게 우선 이겠지만
일단 의심되는거는 g.fixedPrice 이 값이 select안에 없네요.
저거부터 추가 해보시죠
mysql 에러 메시지가 나오는데 그것부터 확인해 보세요.
자세한 내용은 에러를 봐야 할 것 같습니다만 아래 정렬하는 부분에서
((g.fixedPrice - g.goodsPrice)/g.fixedPrice)*100 asc
*100 asc 이 부분으로 인하여 오류가 잘생하지 않나 싶습니다.
위 구문을 괄호를 ( ((g.fixedPrice - g.goodsPrice)/g.fixedPrice)*100 ) asc 이렇게 해 보시는 건 어떨까요 ?
Order by 하는데 굳이 % 계산은 필요 없습니다
((g.fixedPrice - g.goodsPrice)/g.fixedPrice)*100 asc
대신
g.gooddPrice
라고만 해도 됩니다.
쿼리를 이렇게 길게 쓰기도 하는구나~