1

LEFT JOINS を使用して複数のテーブルからデータを選択するクエリがあります。問題は、データが複製されていることです。

ここにクエリがあります

SELECT 
A.ID,
T.T_ID,
T.name,
T.pic,
T.timestamp AS T_ts,
(SELECT COUNT(*) FROM track_plays WHERE T_ID = T.T_ID) AS plays,
(SELECT COUNT(*) FROM track_downloads WHERE T.T_ID) AS downloads,
S.S_ID,
S.status,
S.timestamp AS S_ts,
G.G_ID,                                                
G.gig_name,
G.date_time,
G.lineup,
G.price, 
G.currency,
G.pic AS G_pic,
G.ticket,
G.venue,
G.timestamp AS G_ts

FROM artists A
LEFT JOIN TRACKS T
ON T.ID = A.ID
LEFT JOIN STATUS S
ON S.ID = A.ID
LEFT JOIN GIGS G
ON G.ID = A.ID

WHERE A.ID = '$ID'
ORDER BY S_ts, G_ts AND T_ts DESC LIMIT 20

問題は、結合内のテーブルの 1 つに別のテーブルよりも多くのデータがある場合、データが重複することです。したがって、tracks に 1 行、status に 2 行、gigs に行がない場合、トラックからのデータは 2 倍になります。

使用してみGROUP BY A.IDましたが、データが消去されます。したがって、前に示した例では、show は 1 行しかありませんstatus

私も試してみましGROUP_CONCATたが、その機能についてはよくわからないので、あまり言えません。

USINGSELECT DISTINCTGROUP BY A.ID.

4

1 に答える 1

1

アーティスト -> ギグとアーティスト -> トラックが 1-N マッピングであると仮定すると、2 つの選択肢があります。(どちらもあなたのOPのコメントでカバーされていました

1) 1-1 マップを実現するために取得したい N 行を指定します。

FROM artists A
LEFT JOIN TRACKS T ON T.ID = A.ID AND T.<SOMETHING> = SOMETHING
LEFT JOIN STATUS S ON S.ID = A.ID
LEFT JOIN GIGS G ON G.ID = A.ID AND G.<SOMETHING> = SOMETHNING

2) 書いたとおりに結合を行い、トラックとギグの複数のエントリを取得してから、呼び出しアプリケーションでそれらをピボットします。通常、クエリに ORDER BY 句を入れて、同じアーティスト キーをチェックし、リストをピボットします。

于 2013-06-07T20:37:16.620 に答える