C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: MySQLの1テーブルにて親子関係でSELECT


(過去ログ 127 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■75133 / inTopicNo.1)  MySQLの1テーブルにて親子関係でSELECT
  
□投稿者/ 優希(ゆき) (61回)-(2015/03/03(Tue) 10:29:00)

分類:[データベース全般] 

SQLについて質問です。

例として下記テーブルが有りまして

A    B     C
1    伊藤A
2    伊藤B   1
3    加藤C
4    加藤D   3
5    田中E
6    伊藤F   1


このテーブルをSQLにて、Aが親番号になり、Cに親番号があれば親レコードの下に入れて取得したい(下記の状態)のですが、書き方はありますでしょうか?

A    B     C
1    伊藤A
2    伊藤B   1
6    伊藤F   1
3    加藤C
4    加藤D   3
5    田中E

引用返信 編集キー/
■75134 / inTopicNo.2)  Re[1]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ shu (707回)-(2015/03/03(Tue) 10:52:36)
No75133 (優希(ゆき) さん) に返信

取得してから処理側でソートした方がよいと思いますが、

MySQL環境が今ないので
SQL Serverでのサンプルです。
isnullはtbl.cがnullならtbl.aそうでなければtbl.cという関数になります。

Select tbl.*
From 下記テーブル As tbl
Order By isnull(tbl.c, tbl.a), tbl.a
引用返信 編集キー/
■75135 / inTopicNo.3)  Re[1]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ PANG2 (64回)-(2015/03/03(Tue) 11:02:47)
SQL Server だけど

SELECT *
FROM table1
ORDER BY ISNULL(C,A), A
引用返信 編集キー/
■75136 / inTopicNo.4)  Re[2]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ 優希(ゆき) (62回)-(2015/03/03(Tue) 11:37:22)
No75135 (PANG2 さん) に返信
No75134 (shu さん) に返信

回答有難うございます。

早速試した所、下記の通りになってしまいました。

A     B    C
1    伊藤A
3    加藤C
5    田中E
2    伊藤B   1
6    伊藤F   1
4    加藤D   3

やはり、shuさんがおっしゃってるとおりに、処理側でソートしたほうが早いのでしょうか…


引用返信 編集キー/
■75140 / inTopicNo.5)  Re[2]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ Mira (3回)-(2015/03/03(Tue) 12:28:59)
処理が早いかどうかは置いといて

SELECT A, B, C

FROM table1

ORDER BY
CASE WHEN C IS NULL THEN A ELSE C END,
CASE WHEN C IS NULL THEN 0 ELSE 1 END,
A
引用返信 編集キー/
■75141 / inTopicNo.6)  Re[2]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ PANG2 (65回)-(2015/03/03(Tue) 12:31:03)
MySQLでは、IFNULL かな。

http://variable.jp/2009/11/10/mysql-if-ifnull/
引用返信 編集キー/
■75142 / inTopicNo.7)  Re[3]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ 優希(ゆき) (63回)-(2015/03/03(Tue) 13:09:36)
No75140 (Mira さん) に返信
> 処理が早いかどうかは置いといて
>
> SELECT A, B, C
>
> FROM table1
>
> ORDER BY
> CASE WHEN C IS NULL THEN A ELSE C END,
> CASE WHEN C IS NULL THEN 0 ELSE 1 END,
> A

教えて頂いたSQLを実行しても、下記の状態になってしまいました。

A     B    C
1    伊藤A
3    加藤C
5    田中E
2    伊藤B   1
6    伊藤F   1
4    加藤D   3



引用返信 編集キー/
■75143 / inTopicNo.8)  Re[3]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ 優希(ゆき) (64回)-(2015/03/03(Tue) 13:10:17)
No75141 (PANG2 さん) に返信
> MySQLでは、IFNULL かな。
>
> http://variable.jp/2009/11/10/mysql-if-ifnull/

ありがとうございます。

isnullの箇所はifnullに置換して実行させてました。
引用返信 編集キー/
■75144 / inTopicNo.9)  Re[4]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ Mira (4回)-(2015/03/03(Tue) 13:48:50)
Cのフィールドの仕様について確認します

数値フィールドですか?
何も値が入っていない状態はNullになってますか?

上記の前提でみなさん(私も含んで)回答されています

実は文字フィールドで空の時は空文字が入ってますと言う事でしたら
下記のコードで試してください

SELECT A, B, C
FROM table1
ORDER BY
CASE WHEN C='' THEN A ELSE C END,
CASE WHEN C='' NULL THEN 0 ELSE 1 END,
A

引用返信 編集キー/
■75146 / inTopicNo.10)  Re[5]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ 優希(ゆき) (65回)-(2015/03/03(Tue) 15:14:07)
No75144 (Mira さん) に返信
> Cのフィールドの仕様について確認します
>
> 数値フィールドですか?
> 何も値が入っていない状態はNullになってますか?
>
> 上記の前提でみなさん(私も含んで)回答されています
>
> 実は文字フィールドで空の時は空文字が入ってますと言う事でしたら
> 下記のコードで試してください
>
> SELECT A, B, C
> FROM table1
> ORDER BY
> CASE WHEN C='' THEN A ELSE C END,
> CASE WHEN C='' NULL THEN 0 ELSE 1 END,
> A
>

本番環境では、文字フィールドでした。

例題では数値フィールドでNULLと誤解させる書き方をしまして、すみませんでした。

この方法で、並び替えることは可能になりました。

また、後出しで申し訳ないのですが、これをあたらしくふりがなの項目を追加して、
親子関係+ふりがなで五十音で並び替えることは可能でしょうか?

最終的にはこのようなレコードになります。

A    B     C   D
1    伊藤A   "" いとうエー
2    伊藤B   1   いとうビー
6    伊藤F   1   いとうエフ
3    加藤C ""  かとうシー
4    加藤D   3   かとうデー
5    田中E ""  たなかイー







引用返信 編集キー/
■75165 / inTopicNo.11)  Re[6]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ ななしん (3回)-(2015/03/04(Wed) 11:04:03)
> また、後出しで申し訳ないのですが、これをあたらしくふりがなの項目を追加して、
> 親子関係+ふりがなで五十音で並び替えることは可能でしょうか?
>
> 最終的にはこのようなレコードになります。
>
> A    B     C   D
> 1    伊藤A   "" いとうエー
> 2    伊藤B   1   いとうビー
> 6    伊藤F   1   いとうエフ
> 3    加藤C ""  かとうシー
> 4    加藤D   3   かとうデー
> 5    田中E ""  たなかイー
>

例が前と同じ並びなので、ふりがなでのソートが分かりません。

もし、
7    木村G ""  きむらジー
があった場合、

A    B     C   D
1    伊藤A   "" いとうエー
2    伊藤B   1   いとうビー
6    伊藤F   1   いとうエフ
3    加藤C ""  かとうシー
4    加藤D   3   かとうデー
5    田中E ""  たなかイー
7    木村G ""  きむらジー

となるのでしょうか?

A    B     C   D
1    伊藤A   "" いとうエー
2    伊藤B   1   いとうビー
6    伊藤F   1   いとうエフ
3    加藤C ""  かとうシー
4    加藤D   3   かとうデー
7    木村G ""  きむらジー
5    田中E ""  たなかイー

となるのでしょうか?

また、ふりがなのソートを項目Aより優先した場合、
1    伊藤A   "" いとうエー
2    伊藤B   1   いとうビー
6    伊藤F   1   いとうエフ
でなはく
1    伊藤A   "" いとうエー
6    伊藤F   1   いとうエフ
2    伊藤B   1   いとうビー
となりませんか?



引用返信 編集キー/
■75174 / inTopicNo.12)  Re[7]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ 優希(ゆき) (66回)-(2015/03/04(Wed) 15:19:18)
No75165 (ななしん さん) に返信
> 例が前と同じ並びなので、ふりがなでのソートが分かりません。
>
> もし、
> 7    木村G ""  きむらジー
> があった場合、
>
>
> A    B     C   D
> 1    伊藤A   "" いとうエー
> 2    伊藤B   1   いとうビー
> 6    伊藤F   1   いとうエフ
> 3    加藤C ""  かとうシー
> 4    加藤D   3   かとうデー
> 7    木村G ""  きむらジー
> 5    田中E ""  たなかイー
>

ソートとしては、こちらの並び方になります。

ソートの順としては、項目A,ふりがなの順になります。


引用返信 編集キー/
■75177 / inTopicNo.13)  Re[8]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ shu (710回)-(2015/03/04(Wed) 16:18:41)
No75174 (優希(ゆき) さん) に返信
>>
> 
> ソートとしては、こちらの並び方になります。
> 
> ソートの順としては、項目A,ふりがなの順になります。
> 
項目A, 項目Bの順でソートする場合
項目Aに同じ値がないと項目Bのソートは意味がないです。


既出の例だとAとDのそれぞれのソート順が分かりにくいので
希望のソートがわかりにくくなっています。
例えば
A  C  D
1     いとう
2  1  さとう
3  3  あおき
4   こうだ
5     うえだ
6  1  かきもと

こんな場合はどうなるのでしょう?

引用返信 編集キー/
■75286 / inTopicNo.14)  Re[9]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ 優希(ゆき) (67回)-(2015/03/10(Tue) 14:01:00)
返信が遅くなってすみません。

皆さん有難うございました。

結局は、PGの方で片方ずつ取得して挿入していく方法となりました。

解決方法を模索して下さった、皆様には申し訳ありませんが、解決済みとさせていただきます。
引用返信 編集キー/
■75288 / inTopicNo.15)  Re[10]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ shu (718回)-(2015/03/10(Tue) 14:09:26)
No75286 (優希(ゆき) さん) に返信
> 返信が遅くなってすみません。
>
> 皆さん有難うございました。
>
> 結局は、PGの方で片方ずつ取得して挿入していく方法となりました。
>
> 解決方法を模索して下さった、皆様には申し訳ありませんが、解決済みとさせていただきます。

結局どんなソートを望んでいたか分からないのが残念です。
引用返信 編集キー/
■75292 / inTopicNo.16)  Re[11]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ 優希(ゆき) (68回)-(2015/03/10(Tue) 16:14:33)
No75288 (shu さん) に返信
> ■No75286 (優希(ゆき) さん) に返信
>>返信が遅くなってすみません。
>>
>>皆さん有難うございました。
>>
>>結局は、PGの方で片方ずつ取得して挿入していく方法となりました。
>>
>>解決方法を模索して下さった、皆様には申し訳ありませんが、解決済みとさせていただきます。
>
> 結局どんなソートを望んでいたか分からないのが残念です。

考えていたソートとしては
まずは、五十音順でソートして、その後にサブキーのあるデータは、
そのサブキーを基にして、発見したデータの下に入れるというソートを考えてました。

端的には、五十音順でソートをして家族は親データの下に追加していきたいという考えでした。









引用返信 編集キー/
■75293 / inTopicNo.17)  Re[12]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ shu (719回)-(2015/03/10(Tue) 16:56:55)
No75292 (優希(ゆき) さん) に返信
>
> 端的には、五十音順でソートをして家族は親データの下に追加していきたいという考えでした。
>
CとAでLeft Join自己結合してCがNullのレコードは左側のテーブルからCがNullでないレコードは
右側のテーブルからフリガナを取得し最初のソート項目にするということになりそうですね。
自己結合はコストが高いのでクライアントでのソートでよいと思います。

または

C is Nullで親データのみ取得
C is not Nullで子データのみ取得
クライアント側で結合

というのもありかも。
引用返信 編集キー/
■75341 / inTopicNo.18)  Re[13]: MySQLの1テーブルにて親子関係でSELECT
□投稿者/ 優希(ゆき) (69回)-(2015/03/17(Tue) 17:52:55)
2015/03/18(Wed) 09:49:33 編集(投稿者)

No75293 (shu さん) に返信
> ■No75292 (優希(ゆき) さん) に返信
>>
>>端的には、五十音順でソートをして家族は親データの下に追加していきたいという考えでした。
>>
> CとAでLeft Join自己結合してCがNullのレコードは左側のテーブルからCがNullでないレコードは
> 右側のテーブルからフリガナを取得し最初のソート項目にするということになりそうですね。
> 自己結合はコストが高いのでクライアントでのソートでよいと思います。
>
> または
>
> C is Nullで親データのみ取得
> C is not Nullで子データのみ取得
> クライアント側で結合
>
> というのもありかも。

遅くなってすみません。

ありがとうございます。

今回は、クライアントで結合することになりましたので、
また、他で使用する場合があれば参考にさせていただきます。

回答有難うございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -