sql wr_content in 으로 숫자 4개만 맞는 경우만 추출하려면

sql wr_content in 으로 숫자 4개만 맞는 경우만 추출하려면

QA

sql wr_content in 으로 숫자 4개만 맞는 경우만 추출하려면

본문

번호는 1,3,4,6,7 입니다. 

저장된 여러 게시물 중 wr_content 에 1,3,4,6,7 숫자 중 4개만 맞는 경우만 추출하려면

어떻게해야 될까요? 예로 1,3,6,7,12 이나 1,4,6,7,15 은 해당이 됩니다.

시작부터 아무런 감도 안잡혀 문의 드려요. 도움 부탁 드립니다.ㅜ

 

$sql3 = " select count(*) as cnt, sum(wr_is_comment) as winsum from g5_write_coupon where wr_content in ('1,3,4,6,7') ";
$row3 = sql_fetch($sql3);

이 질문에 댓글 쓰기 :

답변 7

쿼리는 전체를출력하고 php 구문으로 체크해보는걸 권장해드립니다.

구문은  in_array를 쓰면 될것 같구요

if(in_array($row3["wr_content"],array("1","3","4","6","7")))

{

  echo "들어왔으니 출력";

}else{

   echo "안들어왔으니 미출력";

}

Sql 문으로 해결 가능 합니다

 


$sql = " select if((select count(*) from g5_write_coupon where wr_content in ('1,3,4,6,7') ) = 4, 1, 0) check ";
$row = sql_fetch($sql);
if ($row['check']) {
  // 4개에 해당되는 조건
}

이렇게 체크하시면 될것같네요

플래토님 답변 감사합니다.ㅜㅜ
끝에 4,1,0이 4개를 의미하는 것인가요?
g5_write_coupon 테이블에서 wr_content에 1,3,4,6,7 숫자 중 4개가 들어있는 게시물들의
총 갯수를 구하려고 해요. 위에처럼 적용해보았는데 잘 안되네요.ㅜㅜ

제가 작성해드린건
1,3,4,6,7중 4개가 있는 레코드인것을 찾는 구문입니다
1개의 게시물에 4개가 있는것을 찾으려면
쿼리도 조건도 다 다시 구성해야겠네요

그보다 우려는 왜 게시물의 컨텐츠를 복합검색을 해야 하는가?라는 근본적인 질문을 하고싶네요

쿼리를 만들더라도 1000% 매우 느리게됩니다
지금은 새벽에 폰으로 잠시 본것이라 낮에 다시 확인해볼께요

$sql5 = " select count(*) as cnt from {$write_table} g5_write_coupon where wr_content IN (1,3,4,6,7) GROUP BY wr_content HAVING COUNT(DISTINCT wr_content) = 4; ";
$row5 = sql_fetch($sql5);

echo "결과: {$row5[cnt]}";

답변 감사드려요.
이런식으로 하였는데 값이 안나오네요.ㅜㅜ chatGPT에 물어봤어요.

아무래도 wr_content 에 1,3,4,6,7 이란 번호를 당첨번호로 채택하려는게 목적인것같은데요

wr_content라는 컬럼에
임의의 값들이 검색이 되려면
개별적으로 or조건이 걸려야 합니다.

동일레코드에 대해서 보려면 아무래도 한 쿼리의 or 구문을 사용해야만 할것이구요

그런데 맞는지의 카운트를 세려면 wr_content의 값이 1개만 맞아도 1이라는 count 가 체크되어야하고
3,4,6,7, 모두가 동일한 조건에 해당되기때문에
어쩔수없이 개별적으로 카운트후 합산한 값이 4가 되는것이 1 레코드로 인식되어야하고
그게 합산된 값들을 찾으려는것이라서

가장 빠른방법은 경우의 수를 개별컬럼으로 각나열해서 맞는수를 참으로 놓고
그 값이 4개인것만 세어야 하는데 그 역시도 쉽지 않죠

모수의 레코드1개와 동일레코드에 대해서 개별값을 레코드로 카운트한 값만 세어야 할겁니다.

설명이 길었는데

임의의 테이블을 table 이라고할께요



select count(*) cnt  from table a
where 
    ( ( select count(*) from table b where instr(b.wr_content,'1') and b.wr_id = a.wri_id)
       +
      ( select count(*) from table b where instr(b.wr_content,'3') and b.wr_id = a.wri_id )
      +
     ( select count(*) from table b where instr(b.wr_content,'4')  and b.wr_id = a.wri_id)
      +
     ( select count(*) from table b where instr(b.wr_content,'6')  and b.wr_id = a.wri_id)
      +
     ( select count(*) from table b where instr(b.wr_content,'7')  and b.wr_id = a.wri_id)
     ) = 4


 로 각 항목을 검색해서 참일때로 판단해야할것같습니다.

시작부터 왜 이런 방식을 선택하셨는지 설명하시면

더 좋은 해결책이 있을 수 있습니다.

$array7 = array(1,3,4,6,7);

$sql7 = "SELECT COUNT(*) as cnt FROM g5_write_coupon WHERE wr_content IN (".implode(',',$array7).") HAVING COUNT(DISTINCT wr_content) = 4";
$result = sql_query($sql7);
$row7 = mysqli_fetch_assoc($result);
$cnt = $row7['cnt'];

echo "결과: {$cnt}";

 

 

이런식으로 하였는데 값이 안나오네요. chatGPT에 물었습니다.

- Version

SELECT VERSION() FROM DUAL;
/*
+------------+
| VERSION()  |
+------------+
| 5.7.32-log |
+------------+
*/

 

- DDL

CREATE TABLE t2(
  `wr_is_comment` tinyint(4) NOT NULL DEFAULT '0',
  `wr_content` text default NULL
);

 

- DML

INSERT INTO t2 (`wr_is_comment`, `wr_content`) VALUES 
 (0, '1,12,3,7,6')
,(1, '4,1,6,15,7')
,(0, '1')
,(1, '1,2')
,(0, '2,1,3,4,5,6')
,(1, '7,3,4,6,1')
,(0, '1,3,3,4,7,6,7')
,(1, '9,3,4,6,7')
,(1, '2,5,8,9')
,(0, NULL)
;

 

- SELECT : init data

SELECT * FROM t2;
/*
+---------------+---------------+
| wr_is_comment | wr_content    |
+---------------+---------------+
|             0 | 1,12,3,7,6    |
|             1 | 4,1,6,15,7    |
|             0 | 1             |
|             1 | 1,2           |
|             0 | 2,1,3,4,5,6   |
|             1 | 7,3,4,6,1     |
|             0 | 1,3,3,4,7,6,7 |
|             1 | 9,3,4,6,7     |
|             1 | 2,5,8,9       |
|             0 | NULL          |
+---------------+---------------+
*/

 

- SELECT : debug

SELECT 
     wr_is_comment
    ,wr_content
    -- ,wr_content_k
    -- ,comp_k
    -- ,JSON_MERGE_PRESERVE(wr_content_k, comp_k) merged
    ,FLOOR(
        (
            LENGTH(JSON_MERGE_PRESERVE(wr_content_k, comp_k)) - 
            LENGTH(REPLACE(JSON_MERGE_PRESERVE(wr_content_k, comp_k), ': [0, 0]', ''))
        ) / LENGTH(': [0, 0]')
    ) cnt
FROM (
    SELECT 
         wr_is_comment
        ,wr_content
        ,CONCAT('{"', REPLACE(wr_content, ',', '":0,"'), '":0}') wr_content_k
        ,CONCAT('{"', REPLACE('1,3,4,6,7', ',', '":0,"'), '":0}') comp_k
    FROM 
        t2 
) tmp_debug;
/*
+---------------+---------------+------+
| wr_is_comment | wr_content    | cnt  |
+---------------+---------------+------+
|             0 | 1,12,3,7,6    |    4 |
|             1 | 4,1,6,15,7    |    4 |
|             0 | 1             |    1 |
|             1 | 1,2           |    1 |
|             0 | 2,1,3,4,5,6   |    4 |
|             1 | 7,3,4,6,1     |    5 |
|             0 | 1,3,3,4,7,6,7 |    5 |
|             1 | 9,3,4,6,7     |    4 |
|             1 | 2,5,8,9       |    0 |
|             0 | NULL          | NULL |
+---------------+---------------+------+
*/

 

- SELECT : result

SELECT 
     COUNT(*) cnt
    ,(CASE WHEN SUM(wr_is_comment) IS NULL THEN 0 ELSE SUM(wr_is_comment) END) winsum 
FROM 
    t2 
WHERE 
    FLOOR(
        (
            LENGTH(
                JSON_MERGE_PRESERVE(
                    CONCAT('{"', REPLACE(wr_content, ',', '":0,"'), '":0}'),
                    CONCAT('{"', REPLACE('1,3,4,6,7', ',', '":0,"'), '":0}')
                )
            ) - 
            LENGTH(
                REPLACE(
                    JSON_MERGE_PRESERVE(
                        CONCAT('{"', REPLACE(wr_content, ',', '":0,"'), '":0}'), 
                        CONCAT('{"', REPLACE('1,3,4,6,7', ',', '":0,"'), '":0}')
                    ), 
                    ': [0, 0]', 
                    ''
                )
            )
        ) / LENGTH(': [0, 0]')
    ) = 4
;
/*
+-----+--------+
| cnt | winsum |
+-----+--------+
|   4 |      2 |
+-----+--------+
*/

배르만님 답변 감사드려요ㅜ 그런데 작성하신 코드를 php에서 어떻게 사용하나요?;
아래처럼 넣어봤는데 잘 안되네요ㅜ

$csql = "SELECT
    COUNT(*) cnt
    ,(CASE WHEN SUM(wr_is_comment) IS NULL THEN 0 ELSE SUM(wr_is_comment) END) winsum
FROM
    g5_write_coupon
WHERE
    FLOOR(
        (
            LENGTH(
                JSON_MERGE_PRESERVE(
                    CONCAT('{\"', REPLACE(wr_content, ',', '\":0,\"'), '\":0}'),
                    CONCAT('{\"', REPLACE('1,3,4,6,7', ',', '\":0,\"'), '\":0}')
                )
            ) -
            LENGTH(
                REPLACE(
                    JSON_MERGE_PRESERVE(
                        CONCAT('{\"', REPLACE(wr_content, ',', '\":0,\"'), '\":0}'),
                        CONCAT('{\"', REPLACE('1,3,4,6,7', ',', '\":0,\"'), '\":0}')
                    ),
                    ': [0, 0]',
                    ''
                )
            )
        ) / LENGTH(': [0, 0]')
    ) = 4";
$crow = sql_fetch($csql);

echo "결과 {$crow['winsum']}";

php 자체실행이나 php 로 옮겨진 쿼리문으로 동일하게 실행해봤을 경우
이쪽 환경에서는 별다른 문제가 발생하지 않았으며

g5_write_coupon 테이블의 경우 실제 어떠한 구조이며 어떠한 데이터가 있는지는
제3자가 알수 없으며 관련해서는 확인이 불가합니다.

DBMS 버전이 낮아 JSON* 관련 함수가 사용할수 없는 상태일수도 있습니다.

그렇기 때문에 Version, DML 데이터를 명시했습니다.

- Version
- DML
- SELECT

각각 현재 환경과 비교해보시고
안되는 경우 상세히 어떤 부분이 안되는지 발생한 에러메세지는 혹시 있는지
추가 확인이 필요할것 같습니다.

또는 별도의 테스트 테이블을 만들고
테스트 데이터로 정상동작을 확인해보는것도 방법이 될것 같습니다.

디비에서 전부 처리하려는 것 보다는

$a = "1,3,6,7,9";

$arr = explode(",", $a);

쿼리문을 루프로 해서 해당 구간을 $temp = explode(",", $rows["wr_content"]) 로 잘라내고

$arr의 갯수만큼 루프시켜서

$arr[$i]의 값이 $temp안에 있는지(in_array)로 카운트를 증가시키면 되지 않을까 싶네요

 

Select ... From 게시판

Where find_in_set( '1', wr_content)

+find_in_set( '3', wr_content)

+find_in_set( '4', wr_content)

+find_in_set( '6', wr_content)

+find_in_set( '7', wr_content)=4

답변을 작성하시기 전에 로그인 해주세요.
전체 123,162 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT