1

私からの最初の質問ですが、少し複雑な質問ですので、慣れ親しんだエチケットを教えてください。そうですね、ここでは少し複雑なので、コードに入る前に最初に何が欲しいかを説明します。

MySQLデータベースには、組織の表、サービスの表、および組織とサービスを相互参照する表があります。選択したサービスに一致する組織を取得する検索機能を構築していますが、一致するサービスの数に基づいてそれらを並べ替え、それらのサービスが何であるかを一覧表示します。

OK、コードの関連ビットは何でもありません:

組織テーブル(組織):

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トラックの安全性構造を提供します
  • FauxLLCPTSStructuralを提供しています
  • ShakeyPracticeシグナリングを提供します

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 に答える