複数のテーブルがありますが、1つのクエリでデータを取得しようとしています。私は解決策に近いようですが、私が期待しているデータ結果を得ることができないようです。MySQLマルチ結合クエリ
表C
ID
名
略称
表MR(関係テーブルTAT関係テーブルCと一緒にすることによりmは:私のテーブルの
例としては、以下のように(フィールドは切り捨てされている)でありますID)
ID
c.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種類の連合を持っていると仮定)?
内部結合を左結合の上に配置し、それが機能するかどうかを確認してください。 – grepLines
「COUNT( 'cmp.id')」は「COUNT(cmp.id)」にする必要がありますか?また、集計する対象(例:GROUP BY)は何ですか?私はあなたの最後の段落を理解していません。 – Degan
@grepLines:LEFTジョインの前にINNERジョインを配置すると同じ結果が得られます。 – user1785997