MySQL условное соединение зависит от столбца - PullRequest
7 голосов
/ 21 января 2012

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

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;

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

1 Ответ

6 голосов
/ 26 октября 2012

вы не можете условно создавать объединения между таблицами. Лучший способ сделать это - использовать LEFT JOIN и использовать вас CASE в вашем SELECT утверждении. Вы должны указать общие столбцы, которые вы хотите показать,

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...