여러칼럼 검색질문

여러칼럼 검색질문

QA

여러칼럼 검색질문

본문

멤버 테이블 mb_1 ~ mb_7 까지 점수가 있습니다. 

1~10점까지. 

여기서 질문이 있습니다. 

예시)

mb_id mb_1 mb_2 ~~ mb_7
a11 1 7   1
b22 6 1   10
c33 3 5   1
d44 2 1   9

이럴때 mb_1 ~mb_7 의 점수가 1점이 몇개인지 찾는 쿼리가 궁금합니다. 


$sql =" select count(*) as cnt from  {$g5['member_table']} where mb_1 =1 or mb_2 =1 or mb_3 =1 or mb_4 =1 or mb_5 = 1 or mb_6 =1 or mb_7 = 1";
$row = sql_fetch($sql);
$cnt = $row['cnt'];

로 구했는데... 줄일 수 있는 방법이 있을런지요?

이 질문에 댓글 쓰기 :

답변 2

질문의 예에서 1점은 5개나 있어요.

mb_id     mb_1     mb_2     ~~     mb_7
a11     1     7           1
b22     6     1           10
c33     3     5           1
d44     2     1           9

 

"mb_1 ~mb_7 의 점수가 1점이 몇개인지 찾는 쿼리가 궁금"하다 했는데

5를 구하려는 것인가요? 4를 구하려는 것인가요?

아니면 아래처럼 id별 1점 개수를 구하려는 것인가요?

a11 2

b22 1

c33 1

d44 1

정리. 질문의 Query는 1점을 가진 회원수 구하기였고, 그게 제일 간결합니다.

회원수 상관없이 1점이 총 몇 개인지 구하려면, 길어지면 길어졌지 짧게 작성은 어렵습니다.
간단(?)하게는 아래처럼 1점이 포함된 회원을 구하고,
mb_1~mb_7까지 반복하며 1점일 때 카운트 증가시켜주면 되는데…


$sql = "SELECT * FROM {$g5['member_table']} WHERE mb_1=1 OR mb_2=1 OR mb_3=1 OR mb_4=1 OR mb_5=1 OR mb_6=1 OR mb_7=1";
$result = sql_query($sql);
$cnt = 0;
while ( $row=sql_fetch_array($result) ) {
    for ($i=1; $i<=7; $i++) if ( $row['mb_'.$i]==1 ) $cnt++;
}


그보다는 아래가 효율적이네요.

/*
SELECT
SUM(IF(mb_1=1, 1, 0)
+IF(mb_2=1, 1, 0)
+IF(mb_3=1, 1, 0)
+IF(mb_4=1, 1, 0)
+IF(mb_5=1, 1, 0)
+IF(mb_6=1, 1, 0)
+IF(mb_7=1, 1, 0)) AS cnt
FROM {$g5['member_table']}
*/
$sql = "SELECT SUM(IF(mb_1=1,1,0)+IF(mb_2=1,1,0)+IF(mb_3=1,1,0)+IF(mb_4=1,1,0)+IF(mb_5=1,1,0)+IF(mb_6=1,1,0)+IF(mb_7=1,1,0)) AS cnt FROM {$g5['member_table']}";
/* WHERE 조건 그대로 넣어주면, 길어지긴 하지만 좀 더 효율이 좋아집니다.
$sql = "SELECT SUM(IF(mb_1=1,1,0)+IF(mb_2=1,1,0)+IF(mb_3=1,1,0)+IF(mb_4=1,1,0)+IF(mb_5=1,1,0)+IF(mb_6=1,1,0)+IF(mb_7=1,1,0)) AS cnt FROM {$g5['member_table']}
WHERE mb_1=1 OR mb_2=1 OR mb_3=1 OR mb_4=1 OR mb_5=1 OR mb_6=1 OR mb_7=1";
*/
$cnt = sql_fetch($sql)['cnt']; // PHP v5.5 이상 사용 가능
/* PHP v5.5 미만은 아래 기존처럼
$row = sql_fetch($sql);
$cnt = $row['cnt'];
*/


* 참고로 아래 형태도 편하긴 합니다.

SELECT SUM(cnt) AS cnt FROM (
SELECT COUNT(*) AS cnt  FROM {$g5['member_table']} WHERE mb_1=1
UNION ALL
SELECT COUNT(*) AS cnt  FROM {$g5['member_table']} WHERE mb_2=1
UNION ALL
SELECT COUNT(*) AS cnt  FROM {$g5['member_table']} WHERE mb_3=1
UNION ALL
SELECT COUNT(*) AS cnt  FROM {$g5['member_table']} WHERE mb_4=1
UNION ALL
SELECT COUNT(*) AS cnt  FROM {$g5['member_table']} WHERE mb_5=1
UNION ALL
SELECT COUNT(*) AS cnt  FROM {$g5['member_table']} WHERE mb_6=1
UNION ALL
SELECT COUNT(*) AS cnt  FROM {$g5['member_table']} WHERE mb_7=1
) AS T

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

회원로그인

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