mysql conditional join depends on a column

Я пытаюсь реализовать общую систему уведомлений. У меня есть такая структура данных;

notification_base:id,type,object
notificiation_sub:id,user_id,not_base_id,lastNotifyTime
notification_action:id,user_id,not_base_id,action,creationDate

Итак, основной сценарий: пользователь создает элемент базы уведомлений, публикуя статус, или загружая фотографию и т.д. (в данном случае статус, фотография относятся к полю type в таблице notification_base, а object_id - post_id или photo_id в зависимости от типа). Затем пользователь подписывается на этот элемент базы уведомлений... (пользователь 3 подписывается на базу уведомлений 5 и последнее уведомление происходит через x)

После этого другой пользователь касается этого элемента базы уведомлений. (например, прокомментировать статус или поставить лайк фотографии). Это действие записывается в таблицу notification_action (пользователь 5 сделал действие 'like' 12/02/2011)...

Я хочу получить элементы базы уведомлений из подписки пользователя, если время последнего уведомления меньше, чем действие уведомления, то объединить их с действием уведомления. Я могу сделать это с помощью этого 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 сделал "действие" на вашем объекте, который имеет "тип" и object_id в момент времени t

но я также хочу присоединиться к object_id в зависимости от типа. Так я смогу узнать, какой объект был затронут... Но, как вы видите, тип динамичен, если тип = post object id относится post_id к таблице post, если тип=photo object id относится photo_id к таблице photo и т.д...

Я пытаюсь сделать что-то вроде этого, но получил синтаксическую ошибку;

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;

Я знаю, что это не правильно, это как псевдокод

7
задан John Woo 26 October 2012 в 16:33
поделиться