2

ブール列を持つテーブルを結合しようとしています。私の結果では、結合から 2 つの列を取得しようとしています。1 つはブール値が 0 で、もう 1 つは 1 です。

1 対多の関係があるため、GROUP BY を実行する必要があります。

次のクエリは、GROUP BY 以外の正しい結果を返します。

プロファイル ID ごとに、ジャンルと影響力の両方について少なくとも 1 つの行があります。

SELECT p.profileID, IF( gpro.isInfluence =0, g.genreName, NULL ) AS genre, IF( gpro.isInfluence =1, g.genreName, NULL ) AS influence, g.genreName
FROM profiles p
LEFT JOIN genre_profiles gpro ON gpro.profileID = p.profileID
LEFT JOIN genres g ON g.genreID = gpro.genreID
WHERE g.genreName IS NOT NULL 

ただし、対応する GROUP BY/GROUP_CONCAT を実行すると、出力が意味をなしません。

SELECT p.profileID, IF( gpro.isInfluence =0, GROUP_CONCAT( g.genreName ) , NULL ) AS genre, IF( gpro.isInfluence =1, GROUP_CONCAT( g.genreName ) , NULL ) AS influence, g.genreName
FROM profiles p
LEFT OUTER JOIN genre_profiles gpro ON gpro.profileID = p.profileID
LEFT OUTER JOIN genres g ON g.genreID = gpro.genreID
WHERE g.genreName IS NOT NULL 
GROUP BY p.profileID

上記は、gpro.isInfluence 値に基づいて分割されるのではなく、すべての g.genreName 行をいずれかの列にグループ化します。結果が該当する列は、グループ化された最初の結果に対応すると思います。

1000001052  Latin American,Rock,Hip Hop NULL
1000001637  NULL    Electronic,Easy listening,Asian,popgun
1000001666  NULL    Electronic,Bacon,Emo,Modern folk,Hip Hop,R...

私が理解できないのは、最初のクエリのように、ジャンルの値がグループ化され、それぞれの列に含まれていない理由です。

4

2 に答える 2

2
SELECT p.profileID, GROUP_CONCAT( IF( gpro.isInfluence =0, g.genreName, NULL ) ) AS genre, GROUP_CONCAT( IF( gpro.isInfluence =1, g.genreName, NULL ) ) AS influence, g.genreName
FROM profiles p
LEFT OUTER JOIN genre_profiles gpro ON gpro.profileID = p.profileID
LEFT OUTER JOIN genres g ON g.genreID = gpro.genreID
WHERE g.genreName IS NOT NULL 
GROUP BY p.profileID

GROUP_CONCAT を IF ステートメントの外側に置くと、正しい出力が得られます。Ertunc のおかげで、私の脳がそのピボットを作成するのに役立ちました。

于 2012-10-24T06:28:29.057 に答える
0

Selectステートメント with句でIF条件を適用するための非常に基本的なステートメントを次に示します。GROUP BY

GROUP_CONCAT( IF (condition, 1, 0)) col

GROUP_CONCAT として、複数の,分離された値を返します。以下のステートメント行を使用すると、値の重複を避けることができます

GROUP_CONCAT(DISTINCT IF (condition, 1, 0)) col
于 2020-08-24T07:53:30.973 に答える