次のプロジェクト テーブルを検討してください。
Project:
table: project
manyToMany:
themes:
targetEntity: Theme
inversedBy: projects
joinTable:
name: project_theme
joinColumns:
project_id:
referencedColumnName: id
inverseJoinColumns:
theme_id:
referencedColumnName: id
platforms:
targetEntity: Platform
joinTable:
name: project_platform
joinColumns:
project_id:
referencedColumnName: id
inverseJoinColumns:
platform_id:
referencedColumnName: id
manyToOne:
client:
targetEntity: Client
ご覧のとおり、プロジェクトには 3 つのリレーションがあります。project_theme 結合テーブルを介したテーマ、project_platform テーブルを介したプラットフォーム、および client_id 列を介したクライアント。
関連するすべてのプロジェクト (同じテーマ、プラットフォーム、またはクライアントを持つプロジェクト) を検索し、「スコア」で並べ替えるクエリを生成しようとしています。
例えば:
プロジェクト A: テーマ: 18, 19 プラットフォーム: 1、4 クライアント: 22
プロジェクト A に関連するプロジェクトを検索します。
プロジェクト D: テーマ: 18, 19 プラットフォーム: 1、4 クライアント: 22 スコア: 5
プロジェクト G: テーマ: 18, 21 プラットフォーム: 3、4 クライアント: 22 スコア: 3
プロジェクト B: テーマ: 8, 21 プラットフォーム: 2、4 クライアント: 1 スコア: 1
このための MySQL クエリを作成するアシスタントに本当に感謝しています。私はしばらくの間、次のことに苦労してきましたが、おそらく何マイルも離れています:
SELECT
`project`.*,
GROUP_CONCAT(`project_theme`.`theme_id`) as themes,
GROUP_CONCAT(`project_platform`.`platform_id`) as platforms,
`project`.`client_id` as client
FROM `project`
LEFT JOIN `project_theme` ON `project`.`id` = `project_theme`.`project_id`
LEFT JOIN `project_platform` ON `project`.`id` = `project_platform`.`project_id`
GROUP BY `project`.`id`
助けてくれてありがとう
ピート