私からの最初の質問ですが、少し複雑な質問ですので、慣れ親しんだエチケットを教えてください。そうですね、ここでは少し複雑なので、コードに入る前に最初に何が欲しいかを説明します。
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、トラックの安全性、構造を提供します
- FauxLLCはPTSとStructuralを提供しています
- ShakeyPracticeはシグナリングを提供します
PTS、Track Safety、Structuralを提供するすべての組織を取得したい場合は、次のように出力に何かを伝えたいと思います。
A1 Train matched
- PTS
- Track Safety
- Structural
Faux LLC matched
- PTS
- Structural
これが理にかなっていることを願っています。ポインタ、ヒント、完全な回答はすべて歓迎します。説明や詳細情報が必要な場合はお知らせください。
ありがとう