테스트 사이트 - 개발 중인 베타 버전입니다

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

푸른산타 2년 전 조회 1,515

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);</p>

<p>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개

채택된 답변
+20 포인트
2년 전

</p>

<p>$sql = "SELECT * FROM g5_table_aaa";

$qry = sql_query($sql);</p>

<p>

$bg_1 = array();

$bg_1_cnt = 1;

$bg_2 = array();

$bg_2_cnt = 1;

$bg_3 = array();

$bg_3_cnt = 1;</p>

<p>$bg_1_sum = 0;

$bg_2_sum = 0;

$bg_3_sum = 0;</p>

<p>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"];

    }</p>

<p>    if(in_array($row["bg_2"], $bg_2)){

        $bg_2_cnt++;

    }else{

        $bg_2[] = $row["bg_2"];

        $bg_2_sum += $row["bg_2"];

    }</p>

<p>    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;</p>

<p>$temp[0]["sum"] = $bg_1_sum;

$temp[1]["sum"] = $bg_2_sum;

$temp[2]["sum"] = $bg_3_sum;</p>

<p>foreach ((array) $temp as $key => $value) {

    $sort[$key] = $value['sum'];

}</p>

<p>array_multisort($sort, SORT_DESC, $temp);

print_r($temp);</p>

<p>

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 9개

푸른산타
2년 전
@개노미 님 댓글 정말 감사합니다.
위 코드로 테스트 해보니
$bg_1_sum += $row["bg_1"]; 부분 3군데가 에러가 나네요.
Warning: A non-numeric value encountered in
참고로 예시가 숫자로 되어있는데요.
실제는 한글입니다.
개노미
2년 전
[code]
$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);
[/code]
이걸로 한번 해보세요
푸른산타
2년 전
@개노미 님 에러는 안나네요.
print_r($result); 했을시 단 한줄 뿌려주네요.
개노미
2년 전
[code]
$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>";
}
[/code]
$result안에 중복된 값을 기준으로 정렬되어 있을 것이구요
출력은 따로 생각하고 계신게 있는걸까요?
푸른산타
2년 전
@개노미 님 출력은 질문 내용에 있듯이 중복수가 많은 순으로 출력입니다.
지금 주신 코드로 테스트하면 에러는 없는데요.
테이블에 4개 4줄이 저장되어 있는데 주신 코드로하면 딱 한줄만 나오네요.
제가 적용을 잘 못하는건지...ㅠㅠ
우선은 좀 더 확인 해봐야겠네요..;;
개노미
2년 전
죄송합니다;; 제가 코드를 생각만하고 치다보니 result구간에 array로 들어가야 하는데 실수가 있었네요.
[code]
$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>";
}
[/code]
결과
7777(3)
8888(3)
9999(2)
2319(1)
7107(1)
7148(1)
8012(1)
8128(1)
9009(1)
9799(1)

디비셋팅해서 코드 돌려본 것이니 아마 잘 돌지 않을까 싶네요
푸른산타
2년 전
@개노미 님 정말정말 감사합니다^^
완전 대박입니다.
이게 되는군요^^;
개노미
2년 전
괜히 저때문에 한참 해매셨을텐데;;
지금이라도 된다니 다행이네요ㅋㅋ
푸른산타
2년 전
@개노미 님 무슨 말씀을 귀환 시간내서 코드까지 완벽히 해주셨는데요.
다시 한번 깊이 감사드리니다^^

댓글을 작성하려면 로그인이 필요합니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 5개

엑스엠엘
2년 전
bg_1에서 1,3번이 아닌 경우는 어떻게 처리하나요?
푸른산타
2년 전
@엑스엠엘 님
아닌것은 중복이 아니니 새로운 줄이 생기는거죠.
즉 bg_1
9999 (2)
9009 (1)
2319 (1)
9799 (1)
bg_2, bg_3도 마찬가지로 bg_1 처럼이고요.
bg_1,bg_2,bg_3 각 각이 아닌 전체 중 수가 높은순으로 한줄씩 차례로 출력입니다.
말이 안되는건가요? ㅠㅠ
푸른산타
2년 전
@엑스엠엘 님
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)
엑스엠엘
2년 전
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밖에 생각이 안 나네요.
푸른산타
2년 전
@엑스엠엘 신경써주셔서 정말 감사합니다.
@개노미 님께서 제가 원하는 방식을 완벽히 해주셨네요^^;
알려주신 코드도 참고하겠습니다.

댓글을 작성하려면 로그인이 필요합니다.

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

==

설명이 잘 이해가 안 되네요

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

 

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

푸른산타
2년 전
@엑스엠엘 님 댓글 감사합니다.
이미지 첨부해서 올렸습니다.
이미지 참고하시면됩니다^^;

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인