2016-08-04 7 views
-2

これはHacerrankのSQL problemの1つの解決策ですが、私はこのフィールドが初めてであるためこのクエリの仕組みが理解できません。誰もがこれを説明することができますか、私はこのタイプの複雑なクエリを学ぶことができる良いチュートリアルのリンクを与えます。このSQLクエリを理解することができません

SET @d=0,@a=0,@p=0,@s=0; 
SELECT MIN(Doctor),MIN(Professor),MIN(SINGER),MIN(Actor) 
FROM 
(SELECT IF(OCCUPATION='Actor',NAME,NULL) AS Actor, 
     IF(OCCUPATION='Doctor',NAME,NULL) AS Doctor, 
     IF(OCCUPATION='Professor',NAME,NULL) AS Professor, 
     IF(OCCUPATION='Singer',NAME,NULL) AS SINGER, 
    case OCCUPATION when 'ACTOR' THEN @a:[email protected]+1 
        when 'Doctor' THEN @d:[email protected]+1 
        when 'Professor' THEN @p:[email protected]+1 
        when 'Singer' THEN @s:[email protected]+1 
    end 
as idn FROM OCCUPATIONS ORDER BY NAME) AS TMP GROUP BY TMP.idn ; 
+0

- :職業はほとんど持っている方の職業の最大数、)、およびその回数のためにその職業のための人の名前と同じ何もしないでください –

+0

"最小名"(**最小限の名前**を定義する必要がある)という名前のActor、Doctor、Professor、Singerが返されます。確かに非常に奇妙なクエリ! – FDavidov

+0

私はそれが最小の名前(まだ定義されていない)で職業を戻していると思うし、各職業(したがってケース部分)の人々の数を返します - 間違っている可能性があります! – David

答えて

0

分割これまでのセクション

SET @d=0,@a=0,@p=0,@s=0; 

にこれは、これは5列を返す0

SELECT IF(OCCUPATION='Actor',NAME,NULL) AS Actor, 
     IF(OCCUPATION='Doctor',NAME,NULL) AS Doctor, 
     IF(OCCUPATION='Professor',NAME,NULL) AS Professor, 
     IF(OCCUPATION='Singer',NAME,NULL) AS SINGER, 
    case OCCUPATION when 'ACTOR' THEN @a:[email protected]+1 
        when 'Doctor' THEN @d:[email protected]+1 
        when 'Professor' THEN @p:[email protected]+1 
        when 'Singer' THEN @s:[email protected]+1 
    end 
as idn 
FROM OCCUPATIONS 
ORDER BY NAME 

にそれぞれそれらを初期化、最大4つのユーザ変数を設定します。最初の4列は、その行が特定の職業を参照する場合、その行の名前を返します。したがって、その行の職業が '医者'の場合、第2列は名前フィールドの内容を含み、列1,3および4はNULLになります。

第5列は、その職業の数を計算します。これは、名前の順番(MySQLがユーザ変数に値を割り当てることを選択するところで定義されていない)の順番で行われても、されなくてもよい - 今はうまくいくかもしれないが、将来的にはうまくいかないかもしれない。など1を含むその占領し、次の2の最初でその職業の数の連続数を、含まれています基本的になら

SELECT MIN(Doctor),MIN(Professor),MIN(SINGER),MIN(Actor) 
FROM 
(.....) AS TMP GROUP BY TMP.idn ; 

これは、以前のSELECTの結果を取っている(として使用サブクエリ)と結果をカウントでGROUPする。したがって、各カウント値(最大4回まで、各職業につき1回ずつ)は、各職業のMIN(したがって最初のアルファベット順)の名前を返します。 MIN集合関数は、通常はNULL値を無視するので、最初に使用された名前が返されます。

いくつかのダミーデータを使って作業します。例として、以下を使用して: -

id Name Occupation 
1 freda Actor 
2 fredb Doctor 
3 fredc Professor 
4 fredd Actor 
5 frede Doctor 
6 fredf Actor 
7 fredg Professor 
9 fredh Singer 
10 fredi Actor 
11 fredj Doctor 
12 fredk Professor 
13 fredl Actor 
14 fredm Doctor 
15 fredn Professor 
16 fredo Professor 
17 fredp Singer 
19 fredq Doctor 
20 fredr Actor 

サブクエリが得られる: - 外部クエリが使用カウント(すなわちごとに1行を与え、これに作用する

Actor Doctor Professor Singer idn 
freda NULL NULL  NULL 1 
NULL fredb NULL  NULL 1 
NULL NULL fredc  NULL 1 
fredd NULL NULL  NULL 2 
NULL frede NULL  NULL 2 
fredf NULL NULL  NULL 3 
NULL NULL fredg  NULL 2 
NULL NULL NULL  fredh 1 
fredi NULL NULL  NULL 4 
NULL fredj NULL  NULL 3 
NULL NULL fredk  NULL 3 
fredl NULL NULL  NULL 5 
NULL fredm NULL  NULL 4 
NULL NULL fredn  NULL 4 
NULL NULL fredo  NULL 5 
NULL NULL NULL  fredp 2 
NULL fredq NULL  NULL 5 
fredr NULL NULL  NULL 6 

、行の数がされます私はあなたがわからない場合はない負のポイントを助ける必要

Doctor Professor Singer Actor 
fredb fredc  fredh freda 
frede fredg  fredp fredd 
fredj fredk  NULL fredf 
fredm fredn  NULL fredi 
fredq fredo  NULL fredl 
NULL NULL  NULL fredr 
関連する問題