简体   繁体   English

从内部联接表获取计数

[英]Getting count from inner join table

I have tables as described below: 我有如下所述的表格:

subscription_plans (Table for storing all plans) subscription_plans (用于存储所有计划的表)

id   plan   days_limit  added_on  status   rate
------------------------------------------------
1    PlanA     15       1398249706  1      150.00
2    PlanB     15       1398249706  1      150.00     

subscribed_videos (Table for storing details of video in each plans) subscriptiond_videos (用于存储每个计划中的视频详细信息的表)

id   plan_id   videoid
----------------------
1      1        1
2      2        2

subscription_groups (Table for storing groups where a plan can be part of another plan. ie, Plan A be a plan with 2 other individual plans, Plan B and C ) subscription_groups (用于存储组的表,其中一个计划可以是另一个计划的一部分,即,计划A是一个计划,另外两个计划分别为计划B和C)

id   plan_id   assosiated_plan_id   added_on
----------------------------------------------
1      1         2                  1398249706

usersubscription (Table for storing user subscribed plans) usersubscription (用于存储用户订阅计划的表)

id    user_id   plan_id  subscribed_on
---------------------------------------
1     1         1        1398771106

Now, my problem is that how can I get the count of videos for each plans. 现在,我的问题是如何获得每个计划的视频数量。 If Plan A contains both Plan B and C ( subscription_groups table), then the count should return the total video count for each individual plans in that particular plan. 如果计划A同时包含计划B和计划C( subscription_groups表),则计数应返回该特定计划中每个计划的总视频计数。 Now I have done with a query which will return plan details along with count of videos for a plan but I am not able to join it with subscription_groups . 现在,我完成了一个查询,该查询将返回计划详细信息以及计划的视频计数,但是我无法将其与subscription_groups结合使用 How can I accomplish this in a single query. 如何在单个查询中完成此操作。

 $data['planquery']=$this->db->query("select 
 us.plan_id,us.subscribed_on,sp.plan,sp.days_limit,sp.rate,count(sv.videoid) from
 usersubscription as us INNER JOIN
 subscription_plans as sp ON us.plan_id=sp.id INNER JOIN subscribed_videos as sv ON       sp.id=sv.plan_id where sp.status=1 and us.user_id=1");

Expected Result: 预期结果:

plan_id subscribed_on  plan  days_limit  rate   count
-------------------------------------------------------
1       1398771106     PlanA  15         150.00  2

Can anyone help me to find a solution for this? 谁能帮助我找到解决方案?

Thanks in advance. 提前致谢。

You can do so 你可以这样

SELECT 
  us.plan_id,
  us.subscribed_on,
  sp.plan,
  sp.days_limit,
  sp.rate,
  COUNT(sv.videoid) 
FROM
  usersubscription AS us 
  RIGHT JOIN subscription_plans AS sp 
    ON us.plan_id = sp.id 
  INNER JOIN subscribed_videos AS sv 
    ON sp.id = sv.plan_id 
  INNER JOIN subscription_groups g
    ON(g.plan_id =sv .plan_id OR sv.plan_id= g.assosiated_plan_id)
 WHERE sp.status = 1 
 AND (us.user_id = 1 OR us.user_id IS NULL )

Demo 演示

Since user has only plan associated but the associated plan can also has another plan linked so the last condition will check the user id but for is null to for the second linked plan user id will be null due to right join on subscription_plans 由于用户仅关联了计划,但关联的计划也可以链接了另一个计划,因此最后一个条件将检查用户标识,但对于null到,对于第二个链接的计划,由于对subscription_plans正确加入,用户ID将为null

Edit 编辑

SELECT 
u.plan_id,
u.subscribed_on,
p.plan,
  p.days_limit,
  p.rate
,COUNT(DISTINCT v.`videoid`) 
 FROM `usersubscription` u
JOIN `subscription_groups` g 
ON (u.`plan_id` = g.`plan_id`)
RIGHT JOIN `subscription_plans` p 
ON(u.`plan_id` = p.`id` OR g.`assosiated_plan_id` = p.`id`)
INNER JOIN `subscribed_videos` v  ON(v.`plan_id`=g.`assosiated_plan_id` OR u.`plan_id`= v.`plan_id`)
WHERE u.`id`=1 AND p.`status` = 1

Demo 1 Demo2 演示1个 DEMO2

For video ids you can use group_concat 对于视频ID,您可以使用group_concat

SELECT 
u.plan_id,
u.subscribed_on,
p.plan,
  p.days_limit,
  p.rate
,COUNT(DISTINCT v.`videoid`) `video_count` ,
GROUP_CONCAT(DISTINCT v.`videoid`) `video_ids`
 FROM `usersubscription` u
JOIN `subscription_groups` g 
ON (u.`plan_id` = g.`plan_id`)
RIGHT JOIN `subscription_plans` p 
ON(u.`plan_id` = p.`id` OR g.`assosiated_plan_id` = p.`id`)
INNER JOIN `subscribed_videos` v  ON(v.`plan_id`=g.`assosiated_plan_id` OR u.`plan_id`= v.`plan_id`)
WHERE u.`id`=1 AND p.`status` = 1

Demo 1a Demo 2a 演示1a 演示2a

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM