在我的项目中,我需要用户订阅的计划尚未过期。当用户订阅计划时,该计划将被输入用户表表中,其结构如下所示:

id  user_id   plan_id  subscribed_on


用于存储计划详细信息的表为subscription_plans:

id  plan   days_limit  discounted_rate  added_on    status  rate
1   PlanJ  30          240              1403094260  1       245.00


该表将包含项目中订阅计划的详细信息。视频可以是一个或多个计划的一部分。如果视频在计划中,它将存储在subscribed_videos数据库中。

id   plan_id  videoid


一个计划也可以是另一个计划的一部分。假设有计划说A和B。视频1是计划B的一部分,计划a也包含计划B(相关计划)。因此,如果用户订阅了计划A,则计划B中的视频将可供他使用。关联计划的表为subscription_groups。该结构在下面共享:

id  plan_id  assosiated_plan_id  added_on


我需要检查用户是否已订阅了未到期的计划(包含所选视频)(即,它将在subscribed_on + days_limit天到期)。我现在正在使用的当前查询是

    select u.id,sp.days_limit from usersubscription as u INNER JOIN subscription_plans as
sp ON sp.id=u.plan_id where (plan_id IN ( ( SELECT DISTINCT plan_id FROM subscribed_videos
 sv where sv.videoid = 57 ) ) OR id IN ( SELECT DISTINCT assosiated_plan_id AS plan_id FROM
subscription_groups sg JOIN subscribed_videos sv ON sv.plan_id = sg.plan_id WHERE
sv.videoid = 57 ) ) and u.user_id=1 AND DATE_ADD(FROM_UNIXTIME(u.subscribed_on), INTERVAL
sp.days_limit DAY) > NOW()


这将检查ID为1的用户是否订阅了包含ID为57的视频的任何计划(主计划或相关计划)。我将日期保存为整数(unix时间戳)。

谁能帮助我找到解决方案?请检查此SQL FIDDLE

提前致谢

最佳答案

错误已解决。 Check here

只需将子查询中OR子句后的id指向您想要的字段

10-07 11:58
查看更多