1

我的第一个问题,它有点复杂,所以请指导我了解你们都习惯的任何礼仪!是的,这里有点复杂,所以我将在进入代码之前先描述我想要什么。

MySQL 数据库,我有一个组织表、一个服务表和一个交叉引用组织与服务的表。我正在构建一个搜索功能,它将检索与任何选定服务匹配的组织,但将根据它们匹配的服务数量对它们进行排序,并列出这些服务是什么。

好的,代码的相关位是什么:

组织表(组织):

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

外部参照组织服务:

org_id  |  services_id
-------------------------
1   |  1
1   |  2
1   |  4
2   |  1
2   |  4
3   |  5

所以,这意味着:

  • A1 Train提供PTS轨道安全结构
  • Faux LLC提供PTSStructural
  • Shakey Practice提供信号

如果我想检索所有提供 PTS、Track Safety 和 Structural 的组织,我希望输出内容大致如下:

A1 Train matched
    - PTS
    - Track Safety
    - Structural

Faux LLC matched
    - PTS
    - Structural

我希望这是有道理的。指针,提示,完整的答案都欢迎。如果您需要澄清或更多信息,请告诉我。

谢谢

4

1 回答 1

1

你想使用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;
于 2012-04-25T17:38:30.313 回答