2017-09-14 7 views
1

HackerRankからthis challengeを完成します。LEFT JOINは、MySQLでNULLを指定した場合と同じように動作しません。

それが求められ:

ピボットを職業における職業列それぞれの名前をアルファベット順にソートされ、それに対応する職業の下に表示されるようになっています。出力列ヘッダーは、それぞれDoctor、Professor、Singer、およびActorでなければなりません。

これは、このデータのテーブルが含まれます。

私たちは、それぞれの名前がアルファベット順にソートされ、それに対応する職業の下に表示されるようOccupationによって、このテーブルを旋回するようにしたいです。出力列ヘッダー(実際にはない)は、それぞれDoctor、Professor、Singer、およびActorです。私は、このMySQLのコードを実行するとき

しかし、:

SELECT d.name, p.name, s.name, a.name 
FROM (
    SELECT @row_number:[email protected]_number+1 AS row_number, Name 
    FROM OCCUPATIONS, (SELECT @row_number:=0) AS t 
    WHERE Occupation = 'Professor' 
    ORDER BY Name 
    ) p 
LEFT JOIN (
    SELECT @row_number:[email protected]_number+1 AS row_number, Name 
    FROM OCCUPATIONS, (SELECT @row_number:=0) AS t 
    WHERE Occupation = 'Doctor' 
    ORDER BY Name 
    ) d ON d.row_number =p.row_number 
LEFT JOIN (
    SELECT @row_number:[email protected]_number+1 AS row_number, Name 
    FROM OCCUPATIONS, (SELECT @row_number:=0) AS t 
    WHERE Occupation = 'Singer' 
    ORDER BY Name 
    ) s ON p.row_number =s.row_number 
LEFT JOIN (
    SELECT @row_number:[email protected]_number+1 AS row_number, Name 
    FROM OCCUPATIONS, (SELECT @row_number:=0) AS t 
    WHERE Occupation = 'Actor' 
    ORDER BY Name 
    ) a ON p.row_number =a.row_number 

を予想通りLEFT JOIN sが動作しませんし、私が取得:

NULL Ashley NULL NULL 
NULL Belvet NULL NULL 
NULL Britney NULL NULL 
NULL Maria NULL NULL 
NULL Meera NULL NULL 
NULL Naomi NULL NULL 
NULL Priyanka NULL NULL 

は、これは私には意味がありません - なぜジョインは非常に多くのヌルを生成するのですか? MySQLは、複数のテーブルに番号を付けることができないように動作しますか?私には分かりません。

+0

これはセッション変数の問題のようです。各列の項目に番号を付けることも要件ですか? –

+0

同一の変数を同じクエリで複数回使用する場合は注意が必要です(基本的にはできないので、毎回新しい変数を初期化します)。とにかく、問題への解決策として、ここではヒントがあります:max(場合は... 'doctor' then ... end)doctor – Strawberry

答えて

2

@row_numberは、サブクエリごとに1にリセットされていないという理由で一致しないと思われます。

最初の2人(教授と医師)に参加するだけでテストしましたが、CROSS JOINを使用していましたので、すべてのrow_number値を確認できました。

+------------+--------+------------+----------+ 
| row_number | name | row_number | name  | 
+------------+--------+------------+----------+ 
|   8 | Aamina |   1 | Ashley | 
|   8 | Aamina |   2 | Belvet | 
|   8 | Aamina |   3 | Britney | 
|   8 | Aamina |   4 | Maria | 
|   8 | Aamina |   5 | Meera | 
|   8 | Aamina |   6 | Naomi | 
|   8 | Aamina |   7 | Priyanka | 
|   9 | Julia |   1 | Ashley | 
|   9 | Julia |   2 | Belvet | 
|   9 | Julia |   3 | Britney | 
|   9 | Julia |   4 | Maria | 
|   9 | Julia |   5 | Meera | 
|   9 | Julia |   6 | Naomi | 
|   9 | Julia |   7 | Priyanka | 
|   10 | Priya |   1 | Ashley | 
|   10 | Priya |   2 | Belvet | 
|   10 | Priya |   3 | Britney | 
|   10 | Priya |   4 | Maria | 
|   10 | Priya |   5 | Meera | 
|   10 | Priya |   6 | Naomi | 
|   10 | Priya |   7 | Priyanka | 
+------------+--------+------------+----------+ 

あなたは明らかに、行番号が徐々にインクリメントされ、そして両方のサブクエリでの1の初期値がすでに行が番号付けされた時間で行われていることがわかります。

この問題を解決するには、各サブクエリで異なるユーザー変数を使用することがあります。

しかし、このクエリは、あなたが他の職業のメンバーよりも教授の数が少ない場合など、必要に応じて機能しません。

正直なところ、私はSQLでこの種の列形式を実行しません。 4つの独立したクエリを実行し、すべての結果をアプリケーションにフェッチし、出力時に列にフォーマットします。この方法でははるかに簡単になり、シンプルなコードは書きやすく、デバッグが簡単で、保守が簡単です。あなたのコメントを再


:十分

フェア、コーディング挑戦としてこれを行うと、限り、あなた(や他の読者が)実際のプロジェクトでは、過度に巧妙なSQLをやっていることを知っているように、罰金されていないです常に最高のアイデアです。

コーディングの課題があるので、自分で解決する必要があるため、以下の出力を生成するソリューションを提供することはできません。しかし、これは可能であるという証拠です(私は出力を模倣しないことを約束します、私は実際には&を私の端末ウィンドウから貼り付けました)。がんばろう!

+------------+-----------+--------+-----------+----------+ 
| row_number | Professor | Doctor | Singer | Actor | 
+------------+-----------+--------+-----------+----------+ 
|   1 | Ashley | Aamina | Christeen | Eve  | 
|   2 | Belvet | Julia | Jane  | Jennifer | 
|   3 | Britney | Priya | Jenny  | Ketty | 
|   4 | Maria  | NULL | Kristeen | Samantha | 
|   5 | Meera  | NULL | NULL  | NULL  | 
|   6 | Naomi  | NULL | NULL  | NULL  | 
|   7 | Priyanka | NULL | NULL  | NULL  | 
+------------+-----------+--------+-----------+----------+ 
+0

こんにちは、ビル - 明確にするために、私はこのクエリを書いていた唯一の理由はコードチャレンジ - 問題のハイパーリンクを参照してください。 –

+0

うん、私はそれを解決しました - 変数についてのヒントをありがとう!私は通常ポストグルを使用していますので、これは私の快適ゾーンから少し外れていました。 –

関連する問題