分割これまでのセクション
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
- :職業はほとんど持っている方の職業の最大数、)、およびその回数のためにその職業のための人の名前と同じ何もしないでください –
"最小名"(**最小限の名前**を定義する必要がある)という名前のActor、Doctor、Professor、Singerが返されます。確かに非常に奇妙なクエリ! – FDavidov
私はそれが最小の名前(まだ定義されていない)で職業を戻していると思うし、各職業(したがってケース部分)の人々の数を返します - 間違っている可能性があります! – David