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);</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개
</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개
$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]
이걸로 한번 해보세요
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>";
}
[/code]
$result안에 중복된 값을 기준으로 정렬되어 있을 것이구요
출력은 따로 생각하고 계신게 있는걸까요?
지금 주신 코드로 테스트하면 에러는 없는데요.
테이블에 4개 4줄이 저장되어 있는데 주신 코드로하면 딱 한줄만 나오네요.
제가 적용을 잘 못하는건지...ㅠㅠ
우선은 좀 더 확인 해봐야겠네요..;;
[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)
디비셋팅해서 코드 돌려본 것이니 아마 잘 돌지 않을까 싶네요
완전 대박입니다.
이게 되는군요^^;
지금이라도 된다니 다행이네요ㅋㅋ
다시 한번 깊이 감사드리니다^^
댓글을 작성하려면 로그인이 필요합니다.
답변에 대한 댓글 5개
아닌것은 중복이 아니니 새로운 줄이 생기는거죠.
즉 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 '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밖에 생각이 안 나네요.
@개노미 님께서 제가 원하는 방식을 완벽히 해주셨네요^^;
알려주신 코드도 참고하겠습니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
위 코드로 테스트 해보니
$bg_1_sum += $row["bg_1"]; 부분 3군데가 에러가 나네요.
Warning: A non-numeric value encountered in
참고로 예시가 숫자로 되어있는데요.
실제는 한글입니다.