1

次のプロジェクト テーブルを検討してください。

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`

助けてくれてありがとう
ピート

4

2 に答える 2

0

高度なクエリを読んだ後、マーリンのヒントをありがとう。mysql で最も関連するフィールドをランク​​付けし、少し実験して、クラックしたかもしれないと思います...

SELECT 
    p.*,
    (
        IFNULL(themes.matches, 0) + IFNULL(platforms.matches, 0) + IFNULL(clients.matches, 0)
    ) as score
FROM `project` p
LEFT JOIN (
    SELECT t2.project_id, COUNT(*) as matches FROM `project_theme` t1, `project_theme` t2
    WHERE 
      t1.theme_id = t2.theme_id AND t1.project_id = 1
      GROUP BY t2.project_id
) themes ON p.id = themes.project_id
LEFT JOIN (
    SELECT f2.project_id, COUNT(*) as matches FROM `project_platform` f1, `project_platform` f2
    WHERE 
      f1.platform_id = f2.platform_id AND f1.project_id = 1
      GROUP BY f2.project_id
) platforms ON p.id = platforms.project_id
LEFT JOIN (
    SELECT p2.id, COUNT(*) as matches FROM `project` p1, `project` p2
    WHERE 
      p1.client_id = p2.client_id AND p1.id = 1
      GROUP BY p2.id
) clients ON p.id = clients.id
GROUP BY p.`id`
HAVING score > 0
ORDER BY score DESC;
于 2012-11-22T14:15:31.140 に答える
0

タブレットなので手短に。それらを 3 つの別個のクエリと考えて、結合します。キーボードがあれば、SQL で戻ってきます。

于 2012-11-22T14:01:25.437 に答える