개발 Q&A

제목 sql 셀프조인 가능할까요?
글쓴이 darkninja 작성시각 2014/08/14 00:18:01
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 12544   RSS
sql 은 처음 해보는거라서 ㅋ
질문부터 해봅니다.
아래 형태로 가능한지
ci 의 액티브레코드로 변환은 되는지
자료갯수가 많아졌을때 슬로우쿼리(?)로 꼬장을 부리는건 아닌지
궁금합니다!

SELECT a.no, a.subject, a.reg_date, a.reply_count, a.modify_date, b.no as comment_no
FROM post a
LEFT OUTER JOIN post b ON b.original_no = a.no
WHERE a.original_no is null
GROUP BY a.no
ORDER BY a.modify_date DESC
limit 10

SELECT a.no, a.subject, a.reg_date, a.reply_count, a.modify_date, b.no as comment_no
FROM post a
LEFT OUTER JOIN post b
ON b.original_no = a.no
and a.no = (SELECT b1.original_no from post b1 where b1.original_no = a.no order by b1.modify_date desc limit 1)
WHERE a.original_no is null
GROUP BY a.no
ORDER BY a.modify_date DESC
limit 10
  public function recent_posts($limit=10, $cut_len=30) {
		$this->db->select('no, subject, contents, reg_date, reply_count, modify_date');
      $this->db->where('original_no is null');
		$this->db->order_by('modify_date', 'desc');
		$query = $this->db->get($this->post_table, $limit);
		$result = $query->result_array();

    $list = array();
		foreach($result as $i => $row) {
			$list[$i] = new stdClass();
			$list[$i]->href = ROOT_DIR.$this->post_table.'/view/'.$row['no'];

			$str = strip_tags($row['subject']); 
			$list[$i]->subject = mb_substr($str, 0, $cut_len, "UTF-8");

			$list[$i]->reply_count = $row['reply_count'];

			$c = '';
			if ($list[$i]->reply_count > 0) {
				$this->db->select('no');
				$this->db->where('original_no', $row['no']);
				$this->db->order_by('modify_date', 'desc');
				$query = $this->db->get($this->comment_table, 1);
				
				if ($query->num_rows() > 0) {
					$comment = $query->row_array();
					$c = '#comment-'.$comment['no'];
				}	
			}
			$list[$i]->reply_href = ROOT_DIR.$this->post_table.'/view/'.$row['no'].$c;
			$list[$i]->modify_date = $row['modify_date'];
		}
		return $list;
	}
 다음글 익스에서는 잘 된느데 크롬, 파폭, 사파리에선 안되네요... (2)
 이전글 CI툴 사용 초보자입니다. (svn) (8)

댓글

kaido / 2014/08/14 06:20:49 / 추천 0
1. 액티브레코드로 구해지지 않는 쿼리문은 없습니다. 
2. 쿼리를 보니 딱히 아우터 조인을 안쓰셔도 될것 같습니다.
darkninja / 2014/08/14 12:41:39 / 추천 0
액티브레코드가 되긴 하는데 속도가 제일 느립니다.

$this->db->query($sql); 이런 식으로 쿼리문을 바로 실행하면
루프로 돌렸을 때와 거의 비슷한 속도가 나옵니다.

GROUP BY a.no 로 묶지 않으면 자료가 리플갯수 만큼 받아와 집니다.

검색을 해봤지만 조인형태에서 최초 1개의 자료만 받아오는게 가능한 예를
아직 발견하지 못하였습니다.

리플이 수백개씩 달리는 경우라면
사용불가한 쿼리입니다.

결론은 많은 데이타로 테스트 해보고 빠른 넘을 사용하면 되시겠습니다!