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개에 해당되는 조건
}
이렇게 체크하시면 될것같네요
!-->시작부터 왜 이런 방식을 선택하셨는지 설명하시면
더 좋은 해결책이 있을 수 있습니다.
$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에 물었습니다.
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 |
+-----+--------+
*/
디비에서 전부 처리하려는 것 보다는
$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