복붙노트

[SQL] MySQL의 가입 조건은 컬럼에 따라 달라집니다

SQL

MySQL의 가입 조건은 컬럼에 따라 달라집니다

나는이 같은 데이터 구조를 가지고 .. 일반적인 알림 시스템을 구현하기 위해 노력하고있어;

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. ==============================

    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;
    
  2. from https://stackoverflow.com/questions/8948812/mysql-conditional-join-depends-on-a-column by cc-by-sa and MIT license