채택완료

쿼리문 "가,나" 문자열 기준으로 "가" 포함된 행을 찾고싶습니다.

2018-11-08 (목) 08:59:12 3,882

안녕하세요?

질문을 어떻게 정리해야할지..ㅠㅠ

1925979146_1541634705.3179.png

SELECT * FROM `cb_cmall_category` WHERE find_in_set ('강남구', cca_delivery)

이렇게하면 

1925979146_1541634824.737.png

이렇게 찾습니다만..

SELECT * FROM `cb_cmall_category` WHERE find_in_set ('강남구,마마', cca_delivery)

이렇게하면 0행으로 집계됩니다.

1개이상의 지역을 포함된 문자열 모두 찾아줬으면 좋겠는데..

find_in_set 의 찾으려는 문자열은 동적입니다.

'강남구' 하나 또는 '강남구,마포구' 또는 '강남구,마포구,은평구' 처럼 동적입니다.

도와주시면 감사하겠습니다.

|

답변 10개 / 댓글 11개

채택된 답변
+20 포인트

하나의 쿼리문으로만 해결을 하시기 보다는 php 구분자를 분리하는 방식으로 해서 where like 문을 만들어서 like '%강남구%' or 방식으로 해서 쿼리문을 처리되도록 하시는게 좋을듯 합니다.

답변에 대한 댓글 1개

2018-11-08 (목) 09:49:16
답변주셔서감사합니다.
잉끼님하고 플라이님하고 플래토님하고 가장 나은방식을 제시해주신것같네요.
2018-11-08 (목) 09:58:27

굳이 꼭 ("가","나","다") 로 저장할필요는 없어보여서..

1925979146_1541638612.1912.png

1925979146_1541638643.2617.png

이렇게 해볼려고합니다.

배달가능한 업체를 찾는게 주요 이유였는데..

제가 아무래도 첫질문은 구조적문제부터 잘못 발을 딛은것같습니다.

2018-11-08 (목) 09:53:39

그리고 귀한 시간 내주셔서 답변주신분들께 진심의 감사인사드립니다.

한분만 채택해야하는 안타까움이 있어서..

내공이 필요하신분은 따로 쪽지주시면 질문올리고 바로 채택드리겠습니다.

답변에 대한 댓글 1개

그래도 문의 주신글 채택을 하셔야 다음에 글 남기시는게 좋으실겁니다. 2개 이상 채택없이 남길수 없는걸로 알고 있습니다.

PHP로 처리할경우

Copy
<?php

$arrstr = array('강남구','마포구');

$sql_where = " where (1) ";

$i = 0;

foreach($arrstr as $key => $val) {

    if ($i == 0)

        $sql_where .= " ( ";

   else

        $sql_where .= " or ";

    $sql_where .= " cca_delivery like '%".$val."%' ";

    $i++;

}

if ($i == 0)

    $sql_where .= " ) ";

$sql = " select * from  `cb_cmall_category` ".$sql_where;

?>

와 같이 하면 되지 않을까요?

답변에 대한 댓글 1개

2018-11-08 (목) 13:13:50
귀한시간에 정성들여 소스를 작성하여주신점 고개숙여감사드립니다.
따로쪽지주시면 채택해드리겠습니다.
정말감사합니다.

딱 떨어지는 단어가 명확하면 잉끼님의견이 맞는거같고

단어가 문장중간에 포함된 내용들이면 플라이 님의 견이 더 적합할것 같습니다.

하지만 저라면 플라이님의견의 패턴으로 처리할듯 싶네요

답변에 대한 댓글 1개

2018-11-08 (목) 09:52:03
감사합니다.
후자쪽이 맞구요.
찾으려는 지역이 워낙에 많기도 하고 , 동적이기도해서..
찾으려는 지역을 배열로 해서 쿼리문을 만들어야겠네요..ㅠㅠ
쿼리문이 엄청길면 문제가 생길까요?
아니면..
(강남구,은평구,마포구)
찾으려는게 3개면
for문으로 배열수만큼 순회하면서
하나씩 찾는게 나으려나요?

엄청나게 긴 쿼리문을 만든다. vs 찾으려는 지역을 배열수만큼 순환하면서 쿼리집계한다.

SELECT * FROM `cb_cmall_category` WHERE find_in_set('강남구',cca_delivery) or find_in_set('마마',cca_delivery)

답변에 대한 댓글 1개

2018-11-08 (목) 09:47:43
답변주셔서감사드립니다.
찾으려는 지역이 100개이상 될가능성도있어서..ㅠㅠ
2018-11-08 (목) 09:36:03

thumb-1925979146_1541637322.1107_730x567.png

이렇게 하나만 집계됩니다.

저는 7,9,10,11이 집계되길 원하거든요..

SELECT * FROM `cb_cmall_category` WHERE find_in_set(cca_delivery,'강남구,마마')

이렇게 넣으시면 됩니다.

답변에 대한 댓글 1개

2018-11-08 (목) 09:35:11
답변주셔서 감사드려요.
해봤더니 "강남구"만 있는 행 하나만 집계됩니다.

find_in_set 설명을보면 해당위치의 번호를 반환한다고 되어 있습니다.

즉 cca_delivery 와 찾고자 하는 문자가 맞지 않기 때문에 0을 반환하는 듯 싶네요.

cca_delivery 와 찾고자 하는 문자를 정확히 일치시키면 되지 않을까 싶습니다.

참고 주소

https://www.w3resource.com/mysql/string-functions/mysql-find_in_set-function.php

http://skylove1982.tistory.com/388

답변에 대한 댓글 2개

2018-11-08 (목) 09:30:02
답변주셔서 감사드립니다.
찾아야하는 파라미터는 하나만 가능한가보군요..
저는 "강남구,은평구,마포구" 이렇게 찾으려는 문자열이있다면.. 이중에 포함된 cca_delivery 가 있으면 집계하고싶은데
가능한 쿼리가 있을까요?
저도 쿼리고수가 아니라 잘 모르겠습니다.

다만 find_in_set 은 한 행만 리턴하는 쿼리 같습니다.
단순하게 찾기만 한다면 다중 like 를 사용하는게 좋을거 같구요.(단 데이터가 많거나 사용자가 많다면 좋지 않음)

또는 IN 절을 이용해 보는 건 어떨까요?
2018-11-08 (목) 09:15:58

FIND_IN_SAET(칼럼명, "강남구,마포구,은평구")

이 순서가 아닐까요?

반대로 넣으신 것 같습니다.

답변에 대한 댓글 3개

2018-11-08 (목) 09:23:36
답변주셔서 감사드립니다.

SELECT * FROM `cb_cmall_category` WHERE find_in_set (cca_delivery, '강남구,마마')

강남구 포함된 행들이 집계됬으면 좋겠는데 강남구 하나있는 행만 집계하네요.
실제 검색을 하실 거라면 OR로 주루룩 연결하셔야 할 것 같습니다.
그렇지 않고서는 '강남구' 하나만 들어있는 것까지 검색은 어렵지 않나 싶네요.
2018-11-08 (목) 09:54:25
네 계란님 감사합니다. 안그래도 다른분들도 긴 쿼리문 작성을 추천해주시는것같네요.

답변을 작성하려면 로그인이 필요합니다.