我的第一个问题,这是一个有点复杂的问题,所以请引导我完成你们都习惯的任何礼仪!是的,这里有点复杂,所以我将在进入代码之前先描述我想要什么。
MySQL数据库,我有一个组织表,一个服务表,以及一个将组织与服务交叉引用的表。我正在构建一个搜索功能,该功能将检索与任何选定服务匹配的组织,但将根据它们匹配的服务数量对它们进行排序并列出这些服务是什么。
好的,相关的代码 n 什么的:
组织表(组织):
id: INT, AI
name: VARCHAR(150)
服务表(服务):
id: INT, AI
name: VARCHAR(150)
交叉引用表 (xref_org_services):
org_id: INT
service_id: INT
我可以获取与我搜索的任何服务匹配的组织列表:
SELECT DISTINCT organisations.name AS org
FROM organisations
JOIN xref_org_services ON organisations.id=xref_org_services.org_id
WHERE xref_org_services.services_id IN (x, y, z)
ORDER BY org ASC
其中x, y, z
将是我选择的服务的 ID。完成了,没问题。
现在,我想返回每个组织匹配的服务数量以及它们是什么。我试过
SELECT organisations.name AS org, COUNT(xref_org_services.services_id) AS matched
但这给了我匹配的总行数,这不是我想要的。我是否在某处查看嵌套SELECT
进行计数?
最终,我的输出需要像这样:
Org_1 matched 4 services
- Serv_1
- Serv_3
- Serv_4
Org_2 matched 3 services
- Serv_1
- Serv_2
- Serv_4
Org_3 matched 1 service
- Serv_2
我说得有道理吗?让我把一些"数据"放进去,看看我是否可以澄清一下。
组织机构:
id | name
-------------------------
1 | A1 Train
2 | Faux LLC
3 | Shakey Practice
服务业:
id | name
-------------------------
1 | PTS
2 | Track safety
3 | Assessors
4 | Structural
5 | Signalling
xref_org_services:
org_id | services_id
-------------------------
1 | 1
1 | 2
1 | 4
2 | 1
2 | 4
3 | 5
因此,这意味着:
- A1列车提供PTS,轨道安全和结构
- Faux LLC提供PTS和结构
- 摇晃实践提供信令
如果我想检索所有提供 PTS、轨道安全和结构的组织,我希望输出说出类似以下内容的内容:
A1 Train matched
- PTS
- Track Safety
- Structural
Faux LLC matched
- PTS
- Structural
我希望这是有道理的。欢迎指出,提示,完整答案。如果您需要澄清或更多信息,请告诉我。
谢谢
你想使用GROUP BY
:
SELECT
organisations.name AS org,
COUNT(*) AS matched,
GROUP_CONCAT(services.name SEPARATOR "n") AS services
FROM
organisations
LEFT JOIN xref_org_services
ON xref_org_services.org_id = organisations.id
LEFT JOIN services
ON services.id = xref_org_services.services_id
WHERE xref_org_services.services_id IN (x, y, z)
GROUP BY organisations.id
ORDER BY org ASC;