고수님들!! 한방에 해결할 수는 없는가요? > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

고수님들!! 한방에 해결할 수는 없는가요? 정보

고수님들!! 한방에 해결할 수는 없는가요?

본문

여분필드 wr_1 을 사용합니다.
그리고
wr_1 의 값은 A,B,C
입니다.

여기서 A,B,C의 각각의 갯수를 구하려면
$A_ct="select count(wr_1) as wr_1_a from $write_table where wr_1='A' ";
$B_ct="select count(wr_1) as wr_1_b from $write_table where wr_1='B' ";
$C_ct="select count(wr_1) as wr_1_c from $write_table where wr_1='C' ";
입니다.
------------

이 셋을
select count(wr_1~~~~) as wr_1_~~~ from $write_table where wr_1='~~~'
이런 식으로 한방에 불러올 수는 없는가요?
  • 복사

댓글 전체

mysql이 5.0 이상이시면 2가지 방법이 있습니다.
1번째 방법은
select
    (select count(wr_1)  from $write_table where wr_1='A' ) as wr_1_a
    ,(select count(wr_1)  from $write_table where wr_1='B' ) as wr_1_b
    ,(select count(wr_1)  from $write_table where wr_1='C' ) as wr_1_c
요런식으로 해서 머리를 굴려보세요

2번째 방법은
select a.wr_1_a, b.wr_1_b, c.wr_1_c
from
    (select count(wr_1)  as wr_1_a from $write_table where wr_1='A' ) as a
    ,(select count(wr_1)  as wr_1_b from $write_table where wr_1='B' ) as b
    ,(select count(wr_1)  as wr_1_c from $write_table where wr_1='C' ) as c

요런식으로 해보시면 어떨까요?
답변 감사합니다.
설명 1,2중에서 어떤 경우든지 기본적으로 노가다로 다 써주어야 하는군요.

(mysql이 5.0 이상이시면 ) 은  관리자화면에서 phpinfo를 보면 (Client API version  4.0.22)  가 있습니다. 이부분을 말씀하시는 것인가요?
SELECT wr_1, count(*) as count FROM $write_table WHERE wr_1 = 'A' OR wr_1 = 'B' OR wr_1 = 'C' GROUP BY wr_1

라고 하면 결과적으로
----------------
wr_1  | count
----------------
A        | 5
B        | 2
C        | 3
----------------

이렇게 결과가 나올껍니다.
에구.... 꼼작도 안합니다.
-------------
<?
$wr_10_c = "SELECT wr_10, count(*) as count FROM $write_table WHERE wr_10 = '전화' OR wr_10 = '내방' OR wr_10 = '방문' wr_10 = '사이버' wr_10 = '기타' GROUP BY wr_10 ";

$wr_10_cnt = mysql_query($wr_10_c);

for ($i=0; $wr_10_count=sql_fetch_array($wr_10_cnt); $i++)
{   
    echo "$wr_10_count[count]";
} ?>
---------------
하면 아무것도, 경고조차도 나오지 않습니다.
<table cellpadding="0" cellspacing="0">
  <tr>
      <td>상담방법</td><td>상담횟수</td>
  </tr>

<?
$sql = "SELECT wr_10, count(*) as count FROM $write_table WHERE wr_10 = '전화' OR wr_10 = '내방' OR wr_10 = '방문' wr_10 = '사이버' wr_10 = '기타' GROUP BY wr_10 ";

$qry = sql_query($sql);

for ($i=0; $row=sql_fetch_array($qry); $i++)
{   

  $wr_10_name = $row[wr_10];
  $wr_10_count = number_format($row[count]);

?>

<tr>
  <td><?=$wr_10_name?></td>
  <td><?=$wr_10_count?></td>
</tr>

<? } ?>
</table>
---------------------------
위처럼 했을 때에
아래와 같은 메세지가 나옵니다.
---------------------------
SELECT wr_10, count(*) as count FROM g4_write_continue_2 WHERE wr_10 = '전화' OR wr_10 = '내방' OR wr_10 = '방문' wr_10 = '사이버' wr_10 = '기타' GROUP BY wr_10
1064 : You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'wr_10 = '사이버' wr_10 = '기타' GROUP BY wr_10' at line 1

error file : /bbs/board.php
좋은 가르침 감사합니다.

얼굴은 뵙지 못했지만 byfun이라는 아이디만 봐도 기분이 좋습니다.
좋은 플러그인이 나오리라 믿어 의심치 않습니다.

즐거운 마음으로 기대하겠습니다.
잘 작동합니다.
감사드립니다.

한가지 더 알고 싶은 것은 나타난 결과값이 가나다순으로 정렬되는군요.
wr_10 = '전화' OR wr_10 = '내방' OR wr_10 = '방문' OR wr_10 = '사이버' OR wr_10 = '기타'
이렇게 기입한 순서로 나오게 할 수는 없는가요?

wr_10 = '1.전화' OR wr_10 = '2.내방' OR wr_10 = '3.방문' OR wr_10 = '4.사이버' OR wr_10 = '5.기타'
이런 식으로 통계는 쉽지만 챜크된 것만 보이는 게시판의 보기화면은 엉망이 됩니다.

저와 같은 경우를 찾기 위해서 검색을 이것 저것 죽 해봤는데,
저와 비슷한 경우가 없어서 실례를 부릎쓰고 다시 질문드립니다.
쿼리에다가
 - ORDER BY wr_10 DESC (or ASC)
 - ORDER BY count DESC (or ASC)

이정도 정렬 옵션을 주시면 wr_10 이름이나 카운트로 정렬해서 쓸 수 있겠네요.


아니면.. 결과를 추출한 후에 따로 정렬해서 사용하심이 어떨지..

$orders = array("전화", "내방", "방문", "사이버", "기타");
$list = array();
for ($i=0; $row=sql_fetch_array($qry); $i++)

  $index = array_search($row[wr_10], $orders);
  $list[$index] = $row;
}

이렇게 하면 $list 안에 $orders 에 있는 목록 순서대로 저장이 될껍니다.

그리고
for($i=0; $i<count($list); $i++) {
  // do something
}

이런식으로 꼼수를...
좋은 가르치심, 너무 감사드립니다.
둘 중에 아랫것을 시도해보겠습니다.

좋은 밤 되십시요.
올해가 다가기 전에 좋은 일이 있기를 빕니다.
<?
/*  원본
$i = 0;
$j = 0;
$k = 0;
$sql = "SELECT bo_table, bo_subject FROM $g4[board_table] WHERE gr_id = '$wr_gr_id' order by bo_order_search asc ";
$qry = sql_query($sql);

for ($i=0; $row=sql_fetch_array($qry); $i++) {

echo "<tr> <td class='num1' colspan='2'><strong> $row[bo_subject] </strong></td> </tr> ";

$sql2 = "SELECT wr_3, count(*) as count
      FROM g4_write_{$row[bo_table]}
      WHERE
        ca_name = '$wr_num_category'
        and (wr_3 = '전화' OR wr_3 = '내방' OR wr_3 = '방문' OR wr_3 = '사이버' OR wr_3 = '기타')
      GROUP by wr_3 ";

$qry2 = sql_query($sql2);
 
for ($k=0; $row2=sql_fetch_array($qry2); $k++) {

    $wr_3_name = $row2[wr_3];
    $wr_3_count = number_format($row2[count]);
*/
?>
--------------


위가 제가 사용한 원본이구요....결과값이 제대로 나옵니다.
아래가 바이펀님의 가르침을 저 나름대로 적용한 것입니다.
결과는 순서는 나오는 것 같은데
<?=$wr_4_name?> 은 비어있구요,
<?$wr_3_count?>  은 다 "0"으로 나옵니다.
고수님의 좋은 검토를 기다립니다.


-----------------
<table cellpadding="0" cellspacing="0">
  <tr>
      <td>상담방법</td><td>상담횟수</td>
  </tr>
<?
$i = 0;
$j = 0;
$k = 0;
$sql = "SELECT bo_table, bo_subject FROM $g4[board_table] WHERE gr_id = '$wr_gr_id' order by bo_order_search asc ";
$qry = sql_query($sql);

for ($i=0; $row=sql_fetch_array($qry); $i++) {

echo "<tr> <td class='num1' colspan='2'><strong> $row[bo_subject] </strong></td> </tr> ";

$sql2 = "SELECT wr_3, count(*) as count
      FROM g4_write_{$row[bo_table]}
      WHERE
        ca_name = '$wr_num_category'
        and (wr_3 = '전화' OR wr_3 = '내방' OR wr_3 = '방문' OR wr_3 = '사이버' OR wr_3 = '기타')
      GROUP by wr_3 ";
$qry2 = sql_query($sql2);

$orders = array("전화", "내방", "방문", "사이버", "기타");
$list = array();
for ($j=0; $row2=sql_fetch_array($qry2); $j++)

  $index = array_search($row2[wr_3], $orders);
  $list[$index] = $row2;
}

for($k=0; $k<count($list); $k++) {

    $wr_3_name = $row2[wr_3];
    $wr_3_count = number_format($row2[count]);

?>
<tr>
  <td class="num1"><strong><font color="#1AA9DE"><?=$wr_3_name?></font></strong></td>
  <td class="num2" align="right"><?=$wr_3_count?></td>
</tr>
<? } ?>
<? } ?>
</table>
$wr_3_name = $row2[wr_3];
    $wr_3_count = number_format($row2[count]);

이 부분을

    $wr_3_name = $list[$k][wr_3];
    $wr_3_count = number_format($list[$k][count]);

요렇게 바꿔주셔야 할것 같습니다
답변 정말 감사드립니다.

바로 위 댓글질문에 애초에 제가 잘못적용된 질문을 드린 것 같아요.

댓글질문의 소스에도 게시판이름 외에는 wr_3 이름도, 아무런 집계가 나오지 않고,
byfun님의 가르침대로 적용해도 마찬가지입니다.

죄송하지만 byfun님께서 말씀하신 것을 적용한 아랫것을 죽 검토해주시면 감사하겠습니다.

-------------------
<table cellpadding="0" cellspacing="0" class="table">
  <tr><td colspan=2> <font color=red>전체 공통 -----></td></tr>
  <tr>
      <td width="120" height"27" valign="middle" class="subject1"><strong>상담방법</strong></td><td width="40" height="27" align="center" valign="middle" class="subject2"><strong>상담수</strong></td>
  </tr>
<?
$i = 0;
$j = 0;
$k = 0;
$sql = "SELECT bo_table, bo_subject FROM $g4[board_table] WHERE gr_id = '$wr_gr_id' order by bo_order_search asc ";
$qry = sql_query($sql);

for ($i=0; $row=sql_fetch_array($qry); $i++) {

  echo "<tr> <td colspan='2' class='table_name'><strong> $row[bo_subject] </strong></td> </tr> ";

  $sql2 = "SELECT wr_3, count(*) as count
      FROM g4_write_{$row[bo_table]}
      WHERE
        ca_name = '$wr_num_category'
        and (wr_3 = '전화' OR wr_3 = '내방' OR wr_3 = '방문' OR wr_3 = '사이버' OR wr_3 = '기타')
      GROUP by wr_3 ";
  $qry2 = sql_query($sql2);

  $orders = array("전화", "내방", "방문", "사이버", "기타");
  $list = array();
  for ($j=0; $row2=sql_fetch_array($qry2); $j++)
  {
      $index = array_search($row2[wr_3], $orders);
      $list[$index] = $row2;
  }
 
  for($k=0; $k<count($list); $k++) {

      $wr_3_name = $list[$k][wr_3];
      $wr_3_count = number_format($list[$k][count]);
?>
<tr>
  <td class="num1"><?=$wr_3_name?></td>
  <td class="num2"><?=$wr_3_count?></td>
</tr>
<? } ?>
<? } ?>
</table>
질문에 따르면 $sql2 의 결과가 없다는걸로 보이는데, 제가 바로 이해한건지 모르겠네요

for($k=0; $k<count($list); $k++) { 

이 라인 바로 전에
echo $sql2 ;
print_r2($list) ;

해서 출력되는 결과를 알려주세요.
byfun님, 다시 봐주세요.

이 라인 바로 전에
echo $sql2 ;
print_r2($list) ;

에서 (((바로 후))) 로 봤었어요.

다시 님의 지적대로 고쳤습니다. 아래 링크입니다
http://iwoman.or.kr/more/brief.php


---------------------
  $orders = array("전화", "내방", "방문", "사이버", "기타");
  $list = array();
  for ($j=0; $row2=sql_fetch_array($qry2); $j++)
  {
      $index = array_search($row2[wr_3], $orders);
      $list[$index] = $row2;
  }

echo $sql2 ;
print_r2($list) ;

  for($k=0; $k<count($list); $k++) { 

      $wr_3_name = $list[$k][wr_3];
      $wr_3_count = number_format($list[$k][count]);
----------------

이부분대신

for ($k=0; $row2=sql_fetch_array($qry2); $k++) {

    $wr_3_name = $row2[wr_3];
    $wr_3_count = number_format($row2[count]);
-----------------
하면 링크중 아래것이 나옵니다.
통계는 정확합니다.
byfun님!!!
게시물갯수를 늘려보니 정상적으로 작동합니다.
그룹에 들어가 있는 모든 각각의 게시판에, wr_3 의 여러 경우의 값이 빠지지 않고 전부 들어가 있으면 정상작동합니다.
선무당이 사람잡는다고, 제가 byfun님을 힘들게 해드린 것 같습니다.
정말 죄송하고, 또 감사드립니다.


그런데, 게시물의 내용물 속에 wr_1~50까지 사용합니다.
게시물을 작성할 때에 이중에서 해당사항이 없는 것을 기록하지 않습니다.
따라서 아주 상당한 자료가 축적되기 전에는 이러한 현상이 나올 수 밖에 없는 상황입니다.

byfun님!!!
죄송하지만 이에 대비한 가르침을 부탁드립니다.
게시판의 wr_# 에 count 가 0 이면 안나오는 문제인것 맞나요?
결과에 없으면 count 를 0 으로 셋팅하는 코드를 넣어주면 되지 않을까 싶네요.

 for ($j=0; $row2=sql_fetch_array($qry2); $j++)
  {
      $index = array_search($row2[wr_3], $orders);
      $list[$index] = $row2;
  }

위 코드 다음 라인에...

foreach($orders as $k => $v) {
  if(!isset($list[$k])) $list[$k] = array("wr_숫자"=>$v, "count"=>0);
}

sql 로 바로 될지는 모르겠네요.. 저도 sql 구문은 잘 몰라서...
byfun님!!! 
정말 에러없이 잘 돌아갑니다.
byfun님 덕에 큰 짐 덜었습니다.

byfun님!!!
그동안 쌩짜백이 저의 질문에 관심가져주시고,
많은 시간을 할애해주셔서 정말 감사드립니다.
( 앞으로도 관심가져주세요ㅡ,.ㅜ )

풍성한 결실맺는 2011되시길 빕니다.
좋은 밤 되세요.

대박나는 플러그인을 기다리면서,,,,
© SIRSOFT
현재 페이지 제일 처음으로