[김성민]님이 남기신 글:
>안녕하세요.
>답변 감사합니다.
>
>출력은 됩니다만..
>Array
>(
> [3] => 권순구
> [4] => 권용숙
> [5] => 김귀순
> [6] => 김금자
> [7] => 김동현
> [8] => 김미경
> [9] => 김민규
>)
>이런식으로 나오는데 기존 member_list.html 에 해당 쿼리를 주어서
>회원 리스트를 출력하는 html 레이아웃에 끼울려고 합니다.
>
>$not_recent_users = array_diff ($all_users,$recent_users);
>echo '<PRE>';
> print_r ($not_recent_users);
>echo '</PRE>';
>
>echo 문으로 일반 회원 리스트 처럼 이름, 방문일등등 으로 출력하려면...
>
>죄송 합니다. 한번만 더 봐주십쇼~...
========================================
아래 고재두님 의견처럼 응용하시면 됩니다.
table 구조를 보니 SQL 문이 완전히 틀렸네요.
(id 가 UNIQ 하므로 GROUP BY 를 사용하면 안되겠군요)
위의 내용을 구현하는 방법은 여러가지가 있습니다.
문제는 전체 테이블 구조와 회원수(수십만명이면 생각을 달리해야합니다.)
그리고 리스팅하는 알고리즘을 좀 생각해야 합니다.
그 리스트수가 100,200 건이 넘는다면 좀 생각해야 합니다.
즉 다음 페이지로 넘어가는 페이지단위로 또 쪼개어야합니다.
이것은 회원수가 많아지면 절대적으로 그리고 당연히 직면하는 문제입니다.
현재 mysql-3.23.x 이라면 아래와 같이 하면 될겁니다.
## 전체 유저(출석부 명단)
##
function get_all_member_id($table)
{
$users = array();
$sql = 'SELECT id FROM '.$table;
if($result = mysql_query($result))
{
while($row = mysql_fetch_row($result))
{ $users[] = $row[0]; }
@mysql_free_result($result);
}
return $users; // numberic array
}
## (2003-11-01 ~ 2003-11-06) 사이의 방문자 유저
## 기준이 오늘(2003-11-06)의 시각(시간이 아님)이고 5일 전까지이므로
##
function get_recent_user_id($table, $term=5)
{
$users = array();
$term = (int)$term;
$where = date('Y-m-d H:i:s',time()-(86400*$term));
$sql = "SELECT id FROM $table WHERE last_visit > $where";
if($result = mysql_query($result))
{
while($row = mysql_fetch_row($result))
{ $users[] = $row[0]; }
@mysql_free_result($result);
}
return $users; // // numberic array
}
## 최근 5일 동안 방문하지 않는 유저 계산
##
function get_not_recent_userinfo($table, $alluserid, $recentuserid)
{
$userid = $users = array();
$userid = array_diff($alluserid,$recentuserid);
foreach($userid AS $id)
{
$sql = "SELECT * FROM $table WHERE id ='$id'";
if($result = mysql_query($result))
{
while($row = mysql_fetch_assoc($result))
{ $users[$id] = $row; }
@mysql_free_result($result);
}
}
return $users; // associative array
}
$member_table = 'member';
$alluserid = get_all_member_id($table);
$recentuserid = get_recent_user_id($table,5); // 최근 5 일 안에 방문자 모두
$not_visitors = get_not_recent_userinfo($table,$alluserid,$recentuserid);
## 디버깅
echo '<PRE>';
print_r($not_visitors);
---------------
mysql 4.1 이라면 서브쿼리로 날리면 간단한데
3.x 라서 좀 복잡해 보이네요.
직관적으로 코딩한 것이라서 에러가 날 수도 있으니
직접 디버깅해 보세요. |