-- 요런 블로그 어때요?
1. 조회하는 유저 아이디를 입력받고, 제외한다.
SELECT * FROM Users WHERE userId != 1
;
2. Follows 테이블에서 followUserId를 지정하고, 등록한 followerUserId를 출력한다.
SELECT followerUserId FROM Follows WHERE followUserId = 1
;
3. 조회하는 유저와 팔로우 등록된 사람을 제외한다.
SELECT userId, nickname, profileImg FROM Users
WHERE userId NOT IN (SELECT followerUserId FROM Follows WHERE followUserId = 1)
AND userId != 1
;
4. RAND()와 LIMIT을 설정한다.
SELECT userId, nickname, profileImg FROM Users
WHERE userId NOT IN (SELECT followerUserId FROM Follows WHERE followUserId = 1)
AND userId != 1
ORDER BY RAND()
LIMIT 2
;
Front end 1. 추천할 사람이 없을 경우 빈배열로 도착한 것을 처리한다.
-- 팔로워 검색
- /api/search/follower
1. /api/user/follower에서 nickname을 기준으로 검색한다.
-- 유저 프로필 변경
1. 입력받은 데이터를 Users.profileImg로 등록한다.
-- 리블로그
// TODO 만약 리블로그가 하위의 포스트를 참조해 무한 재귀를 반복한 경우는 없겠지?
// TODO 리블로그는 생성할 때 말고는 지정이 불가능 하므로 아직 생성되지 않은 하위의 게시글을 추가할 수 없다.
// TODO 정말 불안하다면 재귀 호출을 조회하는 프로시저에서 검사하도록 하자.
재귀 함수를 호출해 하위의 리블로그 데이터를 출력하도록 설정한다?
== Stored Function 제작
NOT DETERMINISTIC
- Default 설정값
- MySQL은 실행되는 함수의 결괏값이 시시각각 달라진다고 가정
- 비교가 실행되는 레코드마다 Sroted routine을 매번 새로 호출해서 비교를 실행한다.
- 함수 호출의 결괏값이 저장되지 않고, 비교되는 레코드 건수만큼 함수 호출이 발생하는 것
- 즉, 재귀 함수 호출에서 사용한다.
SET @<변수명> = <할당할 값>;
ex) SET @id = 1;
REPEAT(<문자열>, <반복횟수>)
- 문자열을 반봇횟수만큼 반복한다.
어떤 방식으로 리블로그를 구현해야 할까?
- FROM에서 서브쿼리를 사용해 현재 reBlog 데이터가 존재할 경우에는 그 reBlog데이터를 반환하고
- reBlog 데이터가 NULL일 경우에는 다음 postId로 넘어간다
- 내림차순을 하기 위해 마지막 데이터를 가지고 오려면 postId를 MAX 설정한 후 가져오면 된다.
// TODO 만약에 postId를 1씩 내려가면서 조회하는데 중간에 postId가 비었다면?
== 16장 프로시저
Script
- SQL 명령 여러 개를 모으면 복잡한 작업을 처리할 수 있는 코드가 되며 코드를 텍스트파일로 저장한 것
- 다시 입력할 필요 없이 언제든 불러와 재사용할 수 있지만 매번 쿼리창에 붙여 넣어야 하는 불편함 존재
- 형식성이 없어 사용할 때마다 용도에 맞게 약간씩 편집해야 하며 별도의 파일이어서 관리의 부담도 있다.
Stored Procedure (저장 프로시저)
- 스크립트를 아예 서버에 저장해 놓은 것
- 설명적인 이름을 붙일 수 있고 언제든 호출할 수 있으며 인수를 통해 작업거리를 전달할 수 있어 편의성이 높다.
- 특정 작업을 하는 관련 명령을 규칙에 맞게 작성하여 저장해 놓은 것
프로시저
- DB 오브젝트끼리 구분하기 위해 종류별로 접두를 붙이는데 프로시저는 주로 SP_ 접두를 붙인다.
- 정의문 제일 마지막의 END에도 프로시저 이름을 적어둘 수 있다.
- 기능적인 의미는 없지만 정의문의 끝임을 분명히 표시할 수 있어 문서화에 도움이 된다.
- 프로시저의 헤더 다음에 AS 키워드를 쓰고 본체 코드를 기술한다.
- IN <입력받을 변수명> <입력받을 타입>
- OUT <출력할 변수명> <출력할 타입>
SHOW PROCEDURE STATUS;
- 프로시저 목록 확인
SHOW CREATE PROCEDURE <프로시저명>
- 생성한 프로시저 스크립트 확인
CALL <프로시저명>(매개변수);
- 프로시저를 실행한다.
'항해99 > 필기노트' 카테고리의 다른 글
[필기노트] 2021-07-26 DB생성, 임시 데이터 삽입 (0) | 2021.07.27 |
---|---|
[필기노트] 2021-07-22 SQL, 태그 검색, 테스트코드 (0) | 2021.07.23 |
[필기노트] 2021-07-20 SQL, TRIGGER (0) | 2021.07.21 |
[필기노트] 2021-07-19 SQL UNION, CONCAT_GROUP, CASE (0) | 2021.07.20 |
[필기노트] 2021-07-17 SQL, Cookie, Sequelize Migrate (0) | 2021.07.18 |