여러칼럼 검색질문 채택완료
때릴꼬얌
3년 전
조회 2,501
멤버 테이블 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점이 몇개인지 찾는 쿼리가 궁금합니다.
</p>
<p>$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";</p>
<p>$row = sql_fetch($sql);</p>
<p>$cnt = $row['cnt'];</p>
<p>
로 구했는데... 줄일 수 있는 방법이 있을런지요?
댓글을 작성하려면 로그인이 필요합니다.
답변 2개
채택된 답변
+20 포인트
3년 전
질문의 예에서 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
로그인 후 평가할 수 있습니다
답변에 대한 댓글 3개
�
때릴꼬얌
3년 전
아이디 상관없이 1점이 총 몇 개인지 구하려는 것입니다.
B
BiHon
3년 전
정리. 질문의 Query는 1점을 가진 회원수 구하기였고, 그게 제일 간결합니다.
회원수 상관없이 1점이 총 몇 개인지 구하려면, 길어지면 길어졌지 짧게 작성은 어렵습니다.
간단(?)하게는 아래처럼 1점이 포함된 회원을 구하고,
mb_1~mb_7까지 반복하며 1점일 때 카운트 증가시켜주면 되는데…
[code]
$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++;
}
[/code]
그보다는 아래가 효율적이네요.
[code]
/*
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'];
*/
[/code]
* 참고로 아래 형태도 편하긴 합니다.
[code]
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
[/code]
회원수 상관없이 1점이 총 몇 개인지 구하려면, 길어지면 길어졌지 짧게 작성은 어렵습니다.
간단(?)하게는 아래처럼 1점이 포함된 회원을 구하고,
mb_1~mb_7까지 반복하며 1점일 때 카운트 증가시켜주면 되는데…
[code]
$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++;
}
[/code]
그보다는 아래가 효율적이네요.
[code]
/*
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'];
*/
[/code]
* 참고로 아래 형태도 편하긴 합니다.
[code]
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
[/code]
�
때릴꼬얌
3년 전
감사합니다 ^_^
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인