질문Q #2144
SQL 관련 질문입니다.
쿨가이82013-01-11 00:47:23
안녕하세요. 현재 sns를 개발해보며 CI 학습중인데요.
두 Table간 Join을 통해 Data를 가져오는데 애를 먹고 있어서 이렇게 질문 드립니다.

table A (no, user_id, thread_id, subject, contents) 
table B(no, board_id, user_id, name)
이렇게 field가 있습니다. 두 테이블은 thread_id와 board_id로 연결되어 있구요.
table A는 게시판의 글을 저장하는 table이구요, B는 사진을 저장하고 있는 table입니다.

table A의 경우 사진이 없는 row는 thread_id가 0으로 저장되고 사진이 있는 경우는 thread_id가 특정 값으로 채워지구요.
이 경우, 해당 thread_id와 동일한 board_id를 가진 row(사진 정보)가 table B에 n개 있을 수 있습니다.
(즉, 글 하나당 사진은 0~n개가 있을 수 있습니다.)

이 경우, 사진을 포함하던 포함하지 않던 내림차순으로 10개를 보여주고
사진이 포함된 경우는 당연히 사진을 보여주려 합니다.

thread_id가 0이 아닌 경우에만 table B에서 이애 매칭되는 사진 정보를 가져오고 싶은데,
(물론 thread_id가 0이어도 10개에는 포함되어야 합니다. 사진이 있는 글 있는글/없는글 포함 10개라서요.)
SQL을 어떻게 작성해야 할까요? 이것 때문에 계속 골머리를 썩고 있습니다.

고수님들 확인 부탁 드리겠습니다.

 


답변2
#1 우왕아항 2013-01-11 09:57:04
비교적 간단한 쿼리가 될 것 같은데요.

SELECT A.*, B.name AS image_name FROM `TABLE_A` AS A
LEFT OUTER JOIN `TABLE_B` AS B ON A.thread_id = B.board_id
ORDER BY A.no DESC LIMIT 10;

돌려보진 않았지만 이 비슷한 느낌으로 작성하면 되지 싶습니다.

그리고 thread_id와 board_id는 외래키 연결인데
왠만하면 명칭은 통일하는 것이 모호함을 덜어줄 것 같네요
#2 쿨가이8 2013-01-11 21:26:31
답변 감사드립니다.
제가 처음 작성했던 Query가 위와 같은데요. (thread_id만 board_id로 수정하였습니다^^;)

$this->db->select('A.subject, A.contents, B.name');
$this->db->from(A);
$this->db->join('B', 'A.board_id = B.board_id', 'left outer');
$this->db->order_by('A.no', 'desc')->limit(10);
$query = $this->db->get();
$result = $query->result_array();

이 경우, A와 B의 관계가 1:n이다보니 
동일한 A.board_id에 다른 B.name을 가진 A.board_id | B.name row가 n개가 나오게 됩니다.
(즉, 같은 글이 사진 하나당 묶이는거죠.)

저는 글 하나에 사진 여러개를 포함시키도록 view를 구성하고 싶거든요.
마치 A.board_id는 group_by를 한 것처럼 말이죠.

흠 이건 어떻게 해야 할 수 있을까요?^^;;