我正在尝试实现一个通用的通知系统。
notification_base:id,type,object
notificiation_sub:id,user_id,not_base_id,lastNotifyTime
notification_action:id,user_id,not_base_id,action,creationDate
因此,基本方案是,用户通过发布状态来创建通知基础项,或上传照片等(在这种情况下,照片是指notify_base表中的类型字段,而object_id是post_id或photo_id取决于类型)然后用户订阅为此通知基项目。(用户3订阅notification_base
5,最后通知时间x)
之后,另一个用户触摸此notification_base项。(例如,对状态发表评论或对照片进行评论)。此操作记录在notification_action表中(用户5在2011年2月2日做出“喜欢”操作)。
我想要的是如果上次notifiytime小于通知操作,则从用户订阅中获取notification_base项目,然后将它们与notification_action一起加入。
对于用户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。因此,我可以实际了解所接触的对象。但是如您所见,type是动态的,如果type = post object
id引用了post表上的post_id,如果type = photo object 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;
我知道这是不正确的,就像伪代码
您不能有条件地在表之间创建联接。最好的方法是在陈述中使用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;
我正在使用Ingres 11.0 DB,不确定它是否在其他数据库引擎上具有相同的行为,但这里是它 它不会返回表1中的所有记录,但我使用的是左连接,它应该从T1返回aa记录,从t2只处理行,只返回1条记录 如果我将其中一个条件从where子句移动到join条件,它的开始将返回我所期望的结果 问题是为什么它不工作在哪里所有搜索条件在哪里子句,但工作时,我移动t2.id_number从哪里加入条件? 我
问题内容: 我已经尝试解决这个问题一段时间了,希望有人能帮助我。我有两个桌子,第一个桌子是 表名:OnlineTest 第二张表是 表名称:UserStatus 结果 我已经试过这个查询, 但是此查询将带出结果的前两行,而不是最后两行,其中userId和status为null。 如何带来以上结果? 问题答案: 将谓词放在子句中: 这将返回的所有行,其中谓词失败的列填充为。
问题内容: 我必须根据可以为空的值选择相应的列以进行联接。详细地: 如果shoporders.InvoiceAddressId为null,那么我必须使用shoporders.DeliveryAddressId 有什么线索吗? 提前致谢 问题答案:
我想忽略createAlias中的默认连接限制。我有一段一刀切的关系。 我的问题是Hibernate为连接关系生成默认限制。 波约 注:费用表中没有诊断模板栏。 Charge.java 诊断emplate.java 查询 标准 Hibernate查询 如何避免这种情况?或者我的关系有什么问题? 请帮帮我。。!
基于“SC”代码,我需要将SRCTable与RefTable-1或RefTable-2连接起来 条件:如果SC为“D”,则SRCTable在KEY=KEY1上与RefTable-1连接以获得值。否则,如果SC为“U”,则SRCTable与键=键2上的RefTable-2连接 这是输入spark数据帧。 预期产出: 注意:输入表将有数百万条记录,因此需要一个优化的解决方案
致: 我怎么能这么做?