Я пытаюсь реализовать общую систему уведомлений .. У меня есть такая структура данных;
notification_base:id,type,object
notificiation_sub:id,user_id,not_base_id,lastNotifyTime
notification_action:id,user_id,not_base_id,action,creationDate
Таким образом, основной сценарий состоит в том, что пользователь создает элемент базы уведомлений, публикуя статус, или загружает фотографию и т. Д. (В этом случае статус фото относится к полю типа в таблице уведомлений, а object_id - это post_id или photo_id - зависит от типа).
Затем пользователь подписывается на этот элемент messages_base. (Пользователь 3 подписывается на базу уведомлений 5 и время последнего уведомления x)
После этого другой пользователь дотрагивается до этого элемента уведомлений. (например, комментирование статуса или фото)
Это действие записано в таблице уведомлений (пользователь 5 сделает действие «лайк» 12/02/2011) ..
Что мне нужно, так это получить элементы messages_base из пользовательской подписки, если последнее время уведомления меньше действия уведомления, а затем объединить их с уведомлением
Я могу добиться успеха с этим sql;
Для идентификатора пользователя 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 сделал 'действие' над вашим объектом, который имеет 'type' и object_id в момент времени t
но я также хочу, чтобы присоединение к object_id зависело от типа. Таким образом, я действительно могу узнать, какой объект коснулся. Но, как вы можете видеть, тип является динамическим, если type = идентификатор объекта post ссылается на post_id таблицы post, если type = идентификатор объекта фотографии ссылается на 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;
Я знаю, что это не правильно, это как псевдокод