위와 같은 테이블을 보고 질문에 답하시오,
1. 댓글을 가장 많이 작성한 유저는? 1번
select count(user_id), user_id from comments
group by user_id
order by count(user_id) desc ;
2. 사진을 게시한 유저는 모두 몇명? 2 명
select count(distinct user_id) from photos ;
3. 3번 댓글이 달린 사진은? cat-on-road.jpg
select p.file_name from comments c
left join photos p
on c.photo_id = p.photo_id
where
c.id = '3'
이렇게 조회해보니 아래와 같이 p.photo_id 칼럼이 없다고 나온다.
라고 작성하다가..photos 테이블에 photo_id 란 컬럼 값이 없다는것을 문득 깨달음
병신인가.;;;
select p.file_name, c.id from comments c
left join photos p
on c.photo_id = p.id
where
c.id = '3' ;
이렇게 조회하니 잘 조회됨
4. 5번 댓글이 달린 사진의 게시자는? 1번 사용자
select p.user_id from comments as c
left join photos as p
on c.photo_id = p.id
where
c.id = 5 ;
참고
자동으로 부여되는 경우 SERIAL 값을 이용한다.
단, SERIAL 로 설정하는 경우 PRIMARY KEY 선언필요하다.
FK로 선언할 경우에는 PK의 컬럼 타입을 확인하고
REFRENCES 테이블명(컬럼값)을 이용해 관계를 선언한다.
-- users 테이블
CREATE TABLE users(
id SERIAL PRIMARY KEY,
nickname VARCHAR(50),
email VARCHAR(100)
) ;
-- users 레코드 등록
INSERT INTO
users(nickname, email)
VALUES
('cloudstudying_kr', 'mail@cloudstudying.kr'),
('hongpark_cs', 'sehongpark@cloudstudying.kr'),
('haesamq', 'haesamq@naver.com')
;
-- users 조회
select * from users ;
-- photos 테이블
create table photos(
id SERIAL PRIMARY KEY,
file_name VARCHAR(255),
user_id INTEGER REFERENCES users(id) -- FK : 사진게시자의 PK로 연결
)
;
-- photos 레코드 등록
insert into
photos(file_name, user_id)
values
('cat-on-road.jpg', 1),
('sunset-over-the-ocean.jpg', 1),
('andromeda-galaxy.jpg' , 1),
('white-tiger.jpg', 2),
('nero-the-black-cat.jpg', 2 )
;
-- photos 레코드 조회
select * from photos ;
-- comments 테이블 생성
create table comments(
id SERIAL PRIMARY KEY,
body VARCHAR(1000),
user_id INTEGER REFERENCES users(id), --FK 댓글 작성자
photo_id INTEGER REFERENCES photos(id) -- FK 댓글이 달린 사진
);
-- 댓글 등록
insert into
comments (body, user_id, photo_id)
values
('meow', 1, 1),
('냐옹', 2, 1),
('냐냐옹', 3, 1),
('갑니다.', 1, 2),
('안녕하세요.', 2, 2),
('이쿠이쿠', 1, 3),
('오이시', 3, 3)
;
-- 코멘트 테이블 조회
select * from comments ;
댓글
댓글 쓰기