Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 连接3个表时,获取所有第一个表记录时出现问题_Mysql_Mysql Workbench - Fatal编程技术网

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

Mysql 连接3个表时,获取所有第一个表记录时出现问题,mysql,mysql-workbench,Mysql,Mysql Workbench,表包括服务、计划、订阅。要求获取服务表中的所有记录,但这些记录应基于最多的订阅计数进行排序。我能够根据加入条件获取记录,但无法获取没有订阅的服务表中的记录 请注意。每个服务记录都有一个计划。但也可以有没有订阅的服务 **Service** service_id service_name status is_active **Plan** plan_id service_id plan_name plan_cost **Subscribe** subscribe_id plan_id pers

表包括服务、计划、订阅。要求获取服务表中的所有记录,但这些记录应基于最多的订阅计数进行排序。我能够根据加入条件获取记录,但无法获取没有订阅的服务表中的记录

请注意。每个服务记录都有一个计划。但也可以有没有订阅的服务

**Service**
service_id
service_name
status
is_active

**Plan**
plan_id
service_id
plan_name
plan_cost

**Subscribe**
subscribe_id
plan_id
person_name

SELECT DISTINCT s.service_id FROM service s JOIN plan p on s.service_id=p.service_id join
subscribe su on p.plan_id=su.plan_id WHERE
(s.status='Published' AND s.is_active=1) GROUP BY su.plan_id 
ORDER BY COUNT(su.subscribe_id) DESC

有人可以研究一下这个问题并提供帮助。

这可能是表之间的三向联接,按订阅聚合,而不是按计划聚合。大概是这样的:

SELECT s.*
FROM service s
LEFT JOIN plan p
    ON s.service_id = p.service_id
LEFT JOIN subscribe su
    ON p.plan_id = su.plan_id
GROUP BY
    s.service_id
ORDER BY
    COUNT(su.subscribe_id) DESC;
select * from 
SELECT  s.service_id, COUNT(isnull(su.subscribe_id,0)) as [cnt]
FROM service s 
JOIN plan p on s.service_id=p.service_id 
left join subscribe su on p.plan_id=su.plan_id 
WHERE
(s.status='Published' AND s.is_active=1) 
GROUP BY su.plan_id ) A
ORDER BY  [cnt] DESC

如果还希望选择订阅计数,则可以将
计数(su.subscribe\u id)
术语添加到select子句中。请注意,在从
服务
表中选择所有列时,仅通过
服务id
进行聚合应在此处有效,前提是
服务id
是该表中的主键,最简单的答案是,您需要一个左连接,这样您就可以获得服务中的所有记录+订阅中匹配的任何记录

SELECT DISTINCT s.service_id 
FROM service s 
JOIN plan p on s.service_id=p.service_id 
left join subscribe su on p.plan_id=su.plan_id 
WHERE
(s.status='Published' AND s.is_active=1) 
GROUP BY su.plan_id 
ORDER BY COUNT(isnull(su.subscribe_id,0)) DESC
此外,您可能希望将计数移动到select部分。像这样:

SELECT s.*
FROM service s
LEFT JOIN plan p
    ON s.service_id = p.service_id
LEFT JOIN subscribe su
    ON p.plan_id = su.plan_id
GROUP BY
    s.service_id
ORDER BY
    COUNT(su.subscribe_id) DESC;
select * from 
SELECT  s.service_id, COUNT(isnull(su.subscribe_id,0)) as [cnt]
FROM service s 
JOIN plan p on s.service_id=p.service_id 
left join subscribe su on p.plan_id=su.plan_id 
WHERE
(s.status='Published' AND s.is_active=1) 
GROUP BY su.plan_id ) A
ORDER BY  [cnt] DESC

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

搜索左连接。谢谢您的回答。但我仍然面临着同样的问题。我试过你的建议。但我还是得到了匹配条件的记录,但不是所有的服务记录。有些记录与第一个联接匹配,但与第二个联接不匹配。那些记录没有被取回。请帮助您是否尝试将“加入计划”更改为“左加入计划”?是。同样的结果。这个返回什么?选择s.service\u id,*从s.service\u id=p.service\u id上的服务s加入计划p左加入订阅p.plan\u id=su.plan\u id,其中(s.status='Published'和s.is\u active=1)是。成功了。我和我的同事一起工作,找到了相同的解决方案,唯一的区别是我们将其分为“服务id”和“su.plan\u id”。得到同样的结果。通过查看您的示例,它简化了更多。Thx地段。