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