sql 중복 합치고 카운트 많은순으로 출력 문의

sql 중복 합치고 카운트 많은순으로 출력 문의

QA

sql 중복 합치고 카운트 많은순으로 출력 문의

본문

g5_table_aaa 테이블에 aaa, wr_id, bg_1, bg_2, bg_3 아래와 같이 저장이 되어있습니다.

 

wr_id | aaa | bg_1 | bg_2 | bg_3
--------------------------------
11    | abc | 9999 | 8128 | 7777
11    | abc | 9009 | 8888 | 7107
11    | abc | 9999 | 8012 | 7777
11    | abc | 2319 | 8888 | 7148
11    | abc | 9799 | 8888 | 7777


bg_1 중복은 하나로 묵고 카운트는 합친수를 구한다.
bg_2 중복은 하나로 묵고 카운트는 합친수를 구한다.
bg_3 중복은 하나로 묵고 카운트는 합친수를 구한다.

 

이렇게 하려면 sql을 어떻게 해야 하는지요?


아래와 같이하면 다 출력이 되는데요.

 

각 항목 중복은 합치고 카운트수는 합친수로 출력
리스트는 합친수가 많은 순으로 출력

 

잘 아시는 고수님 도움 좀 부탁드립니다.


<?php
$sql = " select *, bg_1, count(*) AS bg_con from g5_table_aaa where aaa = '".$aaa."' and wr_id = ".$wr_id." group by bg_1 order by bg_con desc ";
$query = sql_query($sql);
while($row = sql_fetch_array($query)){
$rows = sql_fetch(" select count(*) as count from g5_table_aaa where aaa = '".$aaa."' and wr_id = ".$wr_id." and bg_1 = '".$row['bg_1']."' ");
?>
<div class="li"><?php echo $row['bg_1']; ?> (<?php echo $rows['count']; ?>)</div>
<div class="li"><?php echo $row['bg_2']; ?> (<?php echo $rows['count']; ?>)</div>
<div class="li"><?php echo $row['bg_3']; ?> (<?php echo $rows['count']; ?>)</div>
<?php } ?>

이 질문에 댓글 쓰기 :

답변 3


$sql = "SELECT * FROM g5_table_aaa";
$qry = sql_query($sql);

$bg_1 = array();
$bg_1_cnt = 1;
$bg_2 = array();
$bg_2_cnt = 1;
$bg_3 = array();
$bg_3_cnt = 1;
$bg_1_sum = 0;
$bg_2_sum = 0;
$bg_3_sum = 0;
while($row = sql_fetch_array($qry)){
    if(in_array($row["bg_1"], $bg_1)){
        $bg_1_cnt++;
    }else{
        $bg_1[] = $row["bg_1"];
        $bg_1_sum += $row["bg_1"];
    }
    if(in_array($row["bg_2"], $bg_2)){
        $bg_2_cnt++;
    }else{
        $bg_2[] = $row["bg_2"];
        $bg_2_sum += $row["bg_2"];
    }
    if(in_array($row["bg_3"], $bg_3)){
        $bg_3_cnt++;
    }else{
        $bg_3[] = $row["bg_3"];
        $bg_3_sum += $row["bg_3"];
    }
}
$temp = array();
$temp[0]["cnt"] = $bg_1_cnt;
$temp[1]["cnt"] = $bg_2_cnt;
$temp[2]["cnt"] = $bg_3_cnt;
$temp[0]["sum"] = $bg_1_sum;
$temp[1]["sum"] = $bg_2_sum;
$temp[2]["sum"] = $bg_3_sum;
foreach ((array) $temp as $key => $value) {
    $sort[$key] = $value['sum'];
}
array_multisort($sort, SORT_DESC, $temp);
print_r($temp);

요런 느낌인데 배열을 좀 더 신경쓴다면 더 좋은 코드가 나올듯 하네요

님 댓글 정말 감사합니다.
위 코드로 테스트 해보니
$bg_1_sum += $row["bg_1"]; 부분 3군데가 에러가 나네요.
Warning: A non-numeric value encountered in
참고로 예시가 숫자로 되어있는데요.
실제는 한글입니다.


$result = array();
$sql = "SELECT bg_1, count(bg_1) AS cnt FROM g5_table_aaa GROUP BY bg_1";
$result[] = sql_fetch($sql);
$sql = "SELECT bg_2, count(bg_2) AS cnt FROM g5_table_aaa GROUP BY bg_2";
$result[] = sql_fetch($sql);
$sql = "SELECT bg_3, count(bg_3) AS cnt FROM g5_table_aaa GROUP BY bg_3";
$result[] = sql_fetch($sql);
foreach ((array) $result as $key => $value) {
    $sort[$key] = $value['cnt'];
}
array_multisort($sort, SORT_DESC, $result);
print_r($result);

이걸로 한번 해보세요


$result = array();
$sql = "SELECT bg_1 AS name, count(bg_1) AS cnt FROM g5_table_aaa GROUP BY bg_1";
$result[] = sql_fetch($sql);
$sql = "SELECT bg_2 AS name, count(bg_2) AS cnt FROM g5_table_aaa GROUP BY bg_2";
$result[] = sql_fetch($sql);
$sql = "SELECT bg_3 AS name, count(bg_3) AS cnt FROM g5_table_aaa GROUP BY bg_3";
$result[] = sql_fetch($sql);
foreach ((array) $result as $key => $value) {
    $sort[$key] = $value['cnt'];
}
array_multisort($sort, SORT_DESC, $result);
foreach($result as $key => $value){
	echo "<div class=\"li\">".$value["name"]."(".$value["cnt"].")</div>";
}

$result안에 중복된 값을 기준으로 정렬되어 있을 것이구요
출력은 따로 생각하고 계신게 있는걸까요?

님 출력은 질문 내용에 있듯이 중복수가 많은 순으로 출력입니다.
지금 주신 코드로 테스트하면 에러는 없는데요.
테이블에 4개 4줄이 저장되어 있는데 주신 코드로하면 딱 한줄만 나오네요.
제가 적용을 잘 못하는건지...ㅠㅠ
우선은 좀 더 확인 해봐야겠네요..;;

죄송합니다;; 제가 코드를 생각만하고 치다보니 result구간에 array로 들어가야 하는데 실수가 있었네요.


$result = array();
$sql = "SELECT bg_1 AS name, count(bg_1) AS cnt FROM g5_table_aaa GROUP BY bg_1";
$qry = sql_query($sql);
while($row = sql_fetch_array($qry)){
	$result[] = $row;
}
$sql = "SELECT bg_2 AS name, count(bg_2) AS cnt FROM g5_table_aaa GROUP BY bg_2";
$qry = sql_query($sql);
while($row = sql_fetch_array($qry)){
	$result[] = $row;
}
$sql = "SELECT bg_3 AS name, count(bg_3) AS cnt FROM g5_table_aaa GROUP BY bg_3";
$qry = sql_query($sql);
while($row = sql_fetch_array($qry)){
	$result[] = $row;
}
foreach ((array) $result as $key => $value) {
    $sort[$key] = $value['cnt'];
}
array_multisort($sort, SORT_DESC, $result);
foreach($result as $key => $value){
	echo "<div class=\"li\">".$value["name"]."(".$value["cnt"].")</div>";
}

결과
7777(3)
8888(3)
9999(2)
2319(1)
7107(1)
7148(1)
8012(1)
8128(1)
9009(1)
9799(1)

디비셋팅해서 코드 돌려본 것이니 아마 잘 돌지 않을까 싶네요

bg_1 중복은 하나로 묵고 카운트는 합친수를 구한다.

==

설명이 잘 이해가 안 되네요

원하시는 결과를 표로 만들어 설명해 보세요.

 

짐작에는 select를 3번 해야 될 것 같습니다

3553783449_1669940661.8311.jpg


아닌것은 중복이 아니니 새로운 줄이 생기는거죠.
즉 bg_1
9999 (2)
9009 (1)
2319 (1)
9799 (1)
bg_2, bg_3도 마찬가지로 bg_1 처럼이고요.
bg_1,bg_2,bg_3 각 각이 아닌 전체 중 수가 높은순으로 한줄씩 차례로 출력입니다.
말이 안되는건가요? ㅠㅠ


wr_id | aaa | bg_1 | bg_2 | bg_3
--------------------------------
11    | abc | 9999 | 8128 | 7777
11    | abc | 9009 | 8888 | 7107
11    | abc | 9999 | 8012 | 7777
11    | abc | 2319 | 8888 | 7148
11    | abc | 9799 | 8888 | 7777

결과값 (1)인것은 순서 상관없습니다.
같은 (3)값 끼로도 순서 관계없습니다.
7777 (3)
8888 (3)
9999 (2)
9009 (1)
2319 (1)
9799 (1)
8012 (1)
8128 (1)
7107 (1)
7148 (1)

select * from (
select 'bg_1' bg_name, bg_1 bg_n, count(*) AS bg_con from g5_table_aaa where aaa = '".$aaa."' and wr_id = ".$wr_id." group by bg_1
union
select 'bg_2' bg_name, bg_2 bg_n, count(*) AS bg_con from g5_table_aaa where aaa = '".$aaa."' and wr_id = ".$wr_id." group by bg_2
union
select 'bg_3' bg_name, bg_3 bg_n, count(*) AS bg_con from g5_table_aaa where aaa = '".$aaa."' and wr_id = ".$wr_id." group by bg_3
) A order by bg_con DESC, bg_name, bg_n

이런 식이면 될 겁니다.
 의미를 모르니 기계적인 sql밖에 생각이 안 나네요.

답변을 작성하시기 전에 로그인 해주세요.
전체 722
QA 내용 검색
filter #sql ×

회원로그인

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