连接3个表时获取所有第一个表记录时出现问题

zpqajqem  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(322)

表是服务、计划、订阅。要求获取服务表中的所有记录,但这些记录应基于最多的订阅计数进行排序。我可以根据加入条件获取记录,但无法获取没有订阅的服务表中的记录。
请注意。每个服务记录都有一个计划。但也可以有没有订阅的服务。

  1. **Service**
  2. service_id
  3. service_name
  4. status
  5. is_active
  6. **Plan**
  7. plan_id
  8. service_id
  9. plan_name
  10. plan_cost
  11. **Subscribe**
  12. subscribe_id
  13. plan_id
  14. person_name
  15. SELECT DISTINCT s.service_id FROM service s JOIN plan p on s.service_id=p.service_id join
  16. subscribe su on p.plan_id=su.plan_id WHERE
  17. (s.status='Published' AND s.is_active=1) GROUP BY su.plan_id
  18. ORDER BY COUNT(su.subscribe_id) DESC

有人能调查一下这个问题并提供帮助吗。

a14dhokn

a14dhokn1#

这可能是表之间的三种连接方式,按订阅聚合,而不是按计划聚合。像这样:

  1. SELECT s.*
  2. FROM service s
  3. LEFT JOIN plan p
  4. ON s.service_id = p.service_id
  5. LEFT JOIN subscribe su
  6. ON p.plan_id = su.plan_id
  7. GROUP BY
  8. s.service_id
  9. ORDER BY
  10. COUNT(su.subscribe_id) DESC;

如果还要选择订阅计数,则可以添加 COUNT(su.subscribe_id) select子句的术语。请注意,按 service_id 单独,同时从 service 表,在这里应该是有效的假设 service_id 是该表中的主键。

9w11ddsr

9w11ddsr2#

好吧,最简单的答案是您需要一个左连接,这样您就可以获得服务中的所有记录+订阅中匹配的任何记录。

  1. SELECT DISTINCT s.service_id
  2. FROM service s
  3. JOIN plan p on s.service_id=p.service_id
  4. left join subscribe su on p.plan_id=su.plan_id
  5. WHERE
  6. (s.status='Published' AND s.is_active=1)
  7. GROUP BY su.plan_id
  8. ORDER BY COUNT(isnull(su.subscribe_id,0)) DESC

另外,您可能希望将计数移到select部分。这样地:

  1. select * from
  2. SELECT s.service_id, COUNT(isnull(su.subscribe_id,0)) as [cnt]
  3. FROM service s
  4. JOIN plan p on s.service_id=p.service_id
  5. left join subscribe su on p.plan_id=su.plan_id
  6. WHERE
  7. (s.status='Published' AND s.is_active=1)
  8. GROUP BY su.plan_id ) A
  9. ORDER BY [cnt] DESC

我对列别名使用了SQLServer约定。如果您使用不同的dbms,只需相应地更改它。如果您遇到服务没有计划的情况,您也应该将其更改为左连接。

展开查看全部

相关问题