mysql로 데이터 불러올때요
본문
게시판 리스트를 40개 불러올건데,
여분필드 wr_1 에 값이 존재하는 데이터 중에 랜덤으로 10개가 먼저 출력되고
나머지 30개는 일반 게시글 30개가 나오도록 하려면
쿼리문을 어떤식으로 짜야하나요??
답변 3
리스트를 40개를 한 페이지 다 출력한다는 가정하에 개발자는 아니어서 스크립트로 처리할 것 같아요
리스트 40개를 json 으로 뿌려줄 페이지 하나 만들고 스크립트로 그 페이지를 접속해서 json 데이터를 가져온 후 랜덤으로 10개, 그 외 30개 를 구분해서 하나의 배열에 담아서 출력할 것 같아요
찾아보니 order by rand() 로 하면 랜덤으로 sorting 되나 봅니다
where wr_1 != '' order by rand() limit 10
이런식으로 하면 랜덤으로 10개 출력 될 것 같구요
40개(전체 글) - 10개(랜덤으로 가져온 글)
차집합 개념으로 전체 글 배열에서 랜덤으로 가져온 글 데이터들을 빼면 일반 게시글 30개만 남을테고
위에서 가져온 랜덤글 10개 와 일반글 30개 가지고 출력하면 되지 않을까 싶네요
!-->
<?php
// wr_1 값 있는 글 중 랜덤 10개
$sql1 = "SELECT * FROM g5_write_yourboard WHERE wr_1 <> '' ORDER BY RAND() LIMIT 10";
$res1 = sql_query($sql1);
$list = array();
while ($row = sql_fetch_array($res1)) {
$list[] = $row;
}
// wr_1 값 없는 일반 글 최신 30개
$sql2 = "SELECT * FROM g5_write_yourboard WHERE wr_1 = '' ORDER BY wr_id DESC LIMIT 30";
$res2 = sql_query($sql2);
while ($row = sql_fetch_array($res2)) {
$list[] = $row;
}
// 이제 $list 에 총 40개 들어 있음
foreach ($list as $item) {
echo $item['wr_id'] . ' - ' . $item['wr_subject'] . '<br>';
}
?>
분리해서 가져와서 합친 다음 출력이 가장 베스트일 것 같습니다.
g5_write_yourboard 여기에 실제 가져올 보드명 쓰심 되구요
!-->
<?php
$bo_table = 'free'; // 게시판 테이블명
$write_table = $g5['write_prefix'] . $bo_table;
// 1. wr_1에 값이 있는 글 중에서 랜덤으로 10개 가져오기
$priority_sql = "SELECT * FROM {$write_table}
WHERE wr_1 > '' AND wr_is_comment = 0
ORDER BY RAND()
LIMIT 10";
$priority_result = sql_query($priority_sql);
$priority_list = array();
while ($row = sql_fetch_array($priority_result)) {
$priority_list[] = $row;
}
// 2. 일반 게시글 30개 가져오기 (wr_1이 빈 값인 글들)
$normal_sql = "SELECT * FROM {$write_table}
WHERE wr_1 = '' AND wr_is_comment = 0
ORDER BY wr_num ASC, wr_reply ASC
LIMIT 30";
$normal_result = sql_query($normal_sql);
$normal_list = array();
while ($row = sql_fetch_array($normal_result)) {
$normal_list[] = $row;
}
// 3. 두 배열을 합치기
$total_list = array_merge($priority_list, $normal_list);
// 4. 출력하기
foreach ($total_list as $list) {
echo $list['wr_subject'] . " - " . $list['wr_datetime'] . "<br>";
}
?>
답변을 작성하시기 전에 로그인 해주세요.