[SQL] MySQL의 가입 조건은 컬럼에 따라 달라집니다
SQLMySQL의 가입 조건은 컬럼에 따라 달라집니다
나는이 같은 데이터 구조를 가지고 .. 일반적인 알림 시스템을 구현하기 위해 노력하고있어;
notification_base:id,type,object
notificiation_sub:id,user_id,not_base_id,lastNotifyTime
notification_action:id,user_id,not_base_id,action,creationDate
그래서 기본적인 시나리오는, 사용자 등을 우편으로 상태를 알림 기본 항목을 만들거나 사진을 업로드하고 (이 경우 상태의 사진은 테이블 notification_base에 필드를 입력 말하며, OBJECT_ID는 post_id를하거나 photo_id 유형에 따라 다름) 그러면 사용자는이 항목 notification_base 구독 .. (사용자 3 5 notification_base 구독 전회 X 통지)
그 다른 사용자 후이 notification_base 항목을 누릅니다. (예를 들어, 사진과 같은 상태 또는 주석) 이 동작은 (12/02/2011에 '와 같이'5 - 사용자 액션) notification_action 테이블에 기록된다 ..
내가 원하는 알림 동작보다 작은 마지막 notifiytime 다음 notification_action로 가입하는 경우 사용자 등록에서 notification_base 항목을 가져올 것입니다 .. 나는이 SQL로 성공할 수있다
사용자 ID (3)와;
select * from notification_action
inner join notification_base on notification_action.not_base_id = notification_base.id
inner join notification_sub on notification_action.not_base_id = notification_sub.not_base_id
where notification_sub.user_id = 3 and notification_sub.lastShowDate < notification_action.creationDate ;
결과는 예를 들어, 내가 원하는 거의이다
사용자 X는 '유형'이 개체의 '행동'을했고, 시간 t에서 것으로, object_id
그러나 나는 또한 내가 실제로 만져 오브젝트하는 배울 수 있도록 OBJECT_ID는 .. 종류에 따라 다릅니다에 가입하려는 ...하지만 형이 포스트 개체 ID를 = 경우 유형, 동적 볼 수있는 유형 = 사진 개체 ID 경우, 포스트 테이블에 post_id를을 말한다 포토 테이블 등의 photo_id을 지칭 ..
나는이 같은 일을하지만 일부 구문 오류가 발생했습니다하려고;
SELECT *
FROM notification_action
INNER JOIN notification_base
ON notification_action.not_base_id = notification_base.id
INNER JOIN notification_sub
ON notification_action.not_base_id = notification_sub.not_base_id CASE notification_base.type
WHEN 'photo'
THEN (
INNER JOIN photo
ON photo.id = notification_base.object_id
)
ELSE (
INNER JOIN post
ON post.id = notification_base.object_id
)
END
WHERE notification_sub.user_id = 3
AND notification_sub.lastShowDate < notification_action.creationDate;
나는 그것이 올바른 아니라고 알고, 그것은 의사 코드처럼
해결법
-
==============================
1.당신이 조건부로 만들 수 없습니다 테이블에 걸쳐 조인. 가장 좋은 방법은 좌 가입하고 SELECT 문에 당신에게 CASE를 사용하는 사용하는 것입니다. 당신은, 당신이 보여주고 싶은 공통 열을 지정해야합니다
당신이 조건부로 만들 수 없습니다 테이블에 걸쳐 조인. 가장 좋은 방법은 좌 가입하고 SELECT 문에 당신에게 CASE를 사용하는 사용하는 것입니다. 당신은, 당신이 보여주고 싶은 공통 열을 지정해야합니다
SELECT *, (CASE notification_base.type WHEN 'photo' THEN photo.columnName1 ELSE post.ColumnName1 END) as ColumnName1, (CASE notification_base.type WHEN 'photo' THEN photo.columnName2 ELSE post.ColumnName2 END) as ColumnName2 FROM notification_action INNER JOIN notification_base ON notification_action.not_base_id = notification_base.id INNER JOIN notification_sub ON notification_action.not_base_id = notification_sub.not_base_id INNER JOIN photo ON photo.id = notification_base.object_id INNER JOIN post ON post.id = notification_base.object_id WHERE notification_sub.user_id = 3 AND notification_sub.lastShowDate < notification_action.creationDate;
from https://stackoverflow.com/questions/8948812/mysql-conditional-join-depends-on-a-column by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 제외 조항에 대한 액세스 대체 (0) | 2020.07.16 |
---|---|
[SQL] 오라클 SQL listagg 기능 (0) | 2020.07.16 |
[SQL] SQL 명령이 제대로 종료되지? (0) | 2020.07.16 |
[SQL] 별개의 기록을 계산하는 방법 (0) | 2020.07.16 |
[SQL] SQL 서버 정규 표현식 (0) | 2020.07.16 |