2017-06-20 9 views
0

複数のテーブルがありますが、1つのクエリでデータを取得しようとしています。私は解決策に近いようですが、私が期待しているデータ結果を得ることができないようです。MySQLマルチ結合クエリ

表C
ID

略称

表MR(関係テーブルTAT関係テーブルCと一緒にすることによりmは:私のテーブルの

例としては、以下のように(フィールドは切り捨てされている)でありますID)
ID
c.id

m.id

表M

表CMP
ID
がcnt.id c.id

表CNT
ID
ID
アクティブ何が欲しいのはCからのすべてのフィールドである

、Mからのすべてのフィールドm.id = c.id、cnt.idにマッチするCMPのすべてのアクティブ(アクティブ= 1)ID。

(繰り返しの数十後)私の最も最近のクエリは次のとおりです。

SELECT c.id AS id 
    , c.name AS name 
    , c.abbreviation AS abbr 
    , c.active AS active 
    , c.last_modified AS last_modified 
    , c.modified_by AS modified_by 
    , mr.media_id 
    , mr.related_object_table 
    , mr.related_object_id 
    , m.orig_name AS img_name 
    , m.unique_name AS img_slug 
    , m.file_type AS confed_file_type 
    , m.file_size AS file_size 
    , COUNT('cmp.id') AS comps 
FROM confederations AS c 
LEFT JOIN media_relationships AS mr 
ON mr.related_object_id = c.id 
AND mr.related_object_table = 'confederations' 
LEFT JOIN media AS m 
ON m.id = mr.media_id 
INNER JOIN countries AS cnt 
ON cnt.confederations_id = c.id 
INNER JOIN competitions AS cmp 
ON cmp.countries_id = cnt.id 
AND cmp.active = 1; 

私が参加して堪能していません。

基本的に、私は期待している結果は次のとおりです。各連合(テーブルC)には、その連合名、省略形、アクティブステータス(アクティブ)、最終変更日、メディア関係テーブル(テーブルMR)から、その連合に関連付けられた画像IDが必要なので、そのIDを使用して、メディアテーブル(M)の連合主画像の画像名と画像スラッグを取得することができます。

ここで、特定のコンフェデレーションのコンペティション(テーブルCMP)の総数も必要です。競争は、国別テーブル(CNTテーブル)の国の主キーIDに関連付けられている国IDで保存されます。 CNTテーブルの各カントリーにはコンフェデレーションIDがあります。コンフェデレーションごとのコンペティションの総数を取得するには、CNTテーブルのCONFEDERATIONS_IDで各国を取得しようとしています。その後、foreachコンフェデレーションで、国IDのグループから一致するCOUNTRIES_IDのテーブルCMPからすべてのコンペを選択しますその与えられた連合のために。 (この時点で、私は自分が望むものを得る方法を自分自身で混乱させていると思う)

どういうわけか、正しい競技会の番号を取得していますが、結果として重複した連合を取得しています。

Competitions 1 : name 1 | abbreviation 1 | image 1 | total competitions = 2; 
Competitions 1 : name 1 | abbreviation 1 | image 1 | total competitions = 1; 
Competitions 1 : name 1 | abbreviation 1 | image 1 | total competitions = 3 

私が間違っているのか:たとえば、私はこれに似た何かを取得しています(私はそれぞれ2,1、および3つの競技で3種類の連合を持っていると仮定)?

+0

内部結合を左結合の上に配置し、それが機能するかどうかを確認してください。 – grepLines

+0

「COUNT( 'cmp.id')」は「COUNT(cmp.id)」にする必要がありますか?また、集計する対象(例:GROUP BY)は何ですか?私はあなたの最後の段落を理解していません。 – Degan

+0

@grepLines:LEFTジョインの前にINNERジョインを配置すると同じ結果が得られます。 – user1785997

答えて

0

、私は実際に自分でこれを解決しました。私は私の答えを投稿しDeganの答えを見に戻ってきた、そしてそれは私のものとは異なる書かれているのに、私は私がなってしまったものにその非常に近いと思います

SELECT 
    cnf.id AS confed_id, cnf.name AS confed_name, cnf.abbreviation AS 
    confed_abbr, cnf.active AS confed_active, cnf.modified_by AS 
    confed_mod_by, cnf.last_modified AS confed_last_mod, 
    COUNT(cnt.id) AS total_countries, 
    COUNT(cmp.id) AS total_comps, 
    mr.media_id, mr.related_object_table, mr.related_object_id, 
    mr.primary_img, 
    m.orig_name AS img_name, m.unique_name AS img_slug, m.file_type AS file_type 
FROM confederations AS cnf 
LEFT JOIN media_relationships AS mr 
ON mr.related_object_id = cnf.id AND mr.related_object_table = 'confederations' 
LEFT JOIN media AS m 
ON m.id = mr.media_id 
LEFT JOIN countries AS cnt 
ON cnt.confederations_id = cnf.id AND cnt.active = 1 
LEFT JOIN competitions AS cmp 
ON cmp.countries_id = cnt.id AND cmp.active = 1 
GROUP BY cnf.id 

のでfarthis私に結果の私を与えているように見えます使える。私のすべての結合のための左結合の私の選択が実際に私に必要なもの全てを与えているかどうか、そしてテーブルが大きくなるとレコードを追加/削除するかどうかはわかりません。 Deganが行ったようにLEFTとINNER JOINの組み合わせとは対照的に、誰かが私の質問で問題を指摘でき、Left Joinを使用しているのであれば助けになります。

0

集計するときにグループ化する必要があります。

は、おそらくこれは、あなたが探しているものに近いです:試行錯誤

SELECT c.id AS id 
    , c.name AS name 
    , c.abbreviation AS abbr 
    , m.orig_name AS img_name 
    , SUM('cmp.id') AS comps 
FROM confederations AS c 
LEFT JOIN media_relationships AS mr 
    ON mr.related_object_id = c.id 
    AND mr.related_object_table = 'confederations' 
LEFT JOIN media AS m 
    ON m.id = mr.media_id 
INNER JOIN countries AS cnt 
    ON cnt.confederations_id = c.id 
INNER JOIN competitions AS cmp 
    ON cmp.countries_id = cnt.id 
    AND cmp.active = 1 
GROUP BY c.id AS id 
     , c.name AS name 
     , c.abbreviation AS abbr 
     , m.orig_name AS img_name 
+0

これを投稿していただきありがとうございます私の質問を編集しました!上記の私の答えで述べたように、私は試用版とエラーで利用可能な解決策を得られるまで約1時間前に投稿しました。私はあなたが見ることができるようにGroup Byを使いました。特定のフィールドに対して冗長な呼び出しを行う理由を説明できます(たとえば、SELECT FROM連合とLEFT JOIN media_relationshipsの両方でc.idなど)。あなたがあなたのMYSQLを書く方法は以前見たものとは異なります。 – user1785997

+0

残念ながら、LEFT JOINの冗長な選択項目は、私のカット/ペーストのタイプミスでした。混乱させて申し訳ありません。それ以外の場合、データセットを持たないので、私は結合が正しいと仮定することができます。 – Degan