質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

1386閲覧

MySqlで、フィールドが縦書き形式になっているときの、データ抽出の方法を知りたいです。

dreamers

総合スコア61

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2021/05/25 08:39

編集2021/05/25 10:40

■おたずねしたいこと

フィールドが縦書きになっているときの、データ抽出の方法を知りたいです。

■具体例

年齢が30歳以上の名前、住所、をSELECT文で求める

・フィールドが横書きの場合

テーブル名:t1

|id|名前|住所|年齢|
|:--|:--:|--:|
|1|佐藤|東京|20|
|2|山田|大阪|30|

SELECT 名前,住所 FROM t1 WHERE 年齢>=30

・上記t1のフィールドが縦書き形式になった場合

テーブル名:t2

id属性年齢
1名前佐藤
1住所東京
1年齢20
2名前山田
2住所大阪
2年齢30

■再度、おたずねしたいこと

上記t2の場合、年齢が30歳以上の名前、住所、を求めるSELECT文は、どのように書けばいいものでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

T2の形式は、SQLアンチパターンとされる**EAV(Entity Attribute Value)**といわれるものです。
アンチパターンとなる理由を確認し、使い分けられた方が良いと思います。
SQLアンチパターン勉強会 第五回:EAV(エンティティ・アトリビュート・バリュー)

取得には色々と方法がありますので、効率重視する場合には、場面に応じて使い分けると良いでしょう。
EAV(Entity Attribute Value)アンチパターンを有効に扱うクエリ

個人的にはコードマスタ等汎用性が必要な場面で、EAVは良く使いますが。。。

投稿2021/05/25 14:23

編集2021/05/25 14:28
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dreamers

2021/05/25 15:45 編集

sazi様、ありがとうございます。 EAVのことを書いている情報はあまり無いように思います。 とても参考になりました。 SQLアンチパターンで、今回の場合のようなデータ抽出する場合、クエリーで、フィールドを横にしてから、SELECT文を使う、というイメージの手順を踏むのですね、 1. データが多いときは、レスポンス速度に不安を感じますが、プロの現場でも紹介していただいたクエリーを使う方法が定石なんでしょうか、 2. 実際の現場では、複数テーブルを結合して、データ抽出することが多いかと思います。 ( https://teratail.com/questions/339999 ) その際、複数テーブルを結合するSELECT文を実行(クエリー実行)した後で、今回のクエリーを実行することになると思いますが、2回もクエリーを実行すると、レスポンス速度に影響が出ると思いますが、実際の現場ではこの問題はどのように回避しているのでしょうか。
sazi

2021/05/25 15:48 編集

SQLやインデックスをゴリゴリにチューニングできるなら、良いでしょうけど、そうでない場合はアンチパターンの面が出やすいのでお薦めはしません。 要は、コメントで質問されているような事が自己解決できるなら使うのも良いでしょうという事です。 現場では実行計画とにらめっこしながらチューニングしています。
dreamers

2021/05/25 15:51 編集

質問を訂正しすぎていて、タイミングがおかしくなったので、ここへ、再度質問を掲載させていただきます。 実際の現場では、複数テーブルを結合して、データ抽出することが多いかと思います。 ( https://teratail.com/questions/339999 ) その際、複数テーブルを結合するSELECT文を実行(クエリー実行)した後で、今回のクエリーを実行することになると思いますが、2回もクエリーを実行すると、レスポンス速度に影響が出ると思いますが、実際の現場ではこの問題はチューニングなどして、回避しているのでしょうね。 ※プロが作ったSQLアンチパターンを素人の私が使う羽目になったもので、素人ながらに、問題解決できる方法はあるものでしょうか、、
sazi

2021/05/25 15:53 編集

現場では実行計画とにらめっこしながらチューニングしています。 基本必要なインデックスを設定して、抽出される件数によって何を駆動表にするかとか、件数が少ないならサブクエリーの方が良いとか、過去の経験と照らしてのコーディングし、実行計画で検証しながらのチューニングです。 それも、実装が始まる前のDB設計の段階から性能が担保できるかを検証します。
dreamers

2021/05/25 15:56 編集

スイマセン、質問の訂正がおおく、タイミングが悪くなってしまって、、、 プロが作ったSQLアンチパターンを素人の私が使う羽目になったもので、素人ながらに、2回クエリーの問題を解決できる方法はあるものでしょうか、、
sazi

2021/05/25 15:56

チューニングにより解決は出来ると思いますよ。 具体的なSQLとか言われても困りますが。
sazi

2021/05/25 15:57

現状ではリンク先のようなパターンで取り敢えず試してみてとしか言いようが無いです。
dreamers

2021/05/25 16:02

sazi様、お忙しい中、夜分、ご丁寧なご回答、ありがとうございます。 凄い世界ですね、DB設計、実行計画、チューニング、、、目がくらむ思いです。 まずは、アドバイスいただいたリンク先のパターンでやってみます。 このたびは、誠にありがとうございました。
dreamers

2021/05/26 04:44

クエリーを数回実行することによるレスポンス遅延対応として、クエリーに対応するビューを2回作成して、仮想テーブルのようなものを作成しました。都度、クエリーを動かすより、ビューをつくっておけば、少しはレスポンスは改善されるものでしょうか。
sazi

2021/05/26 05:44 編集

> 改善されるものでしょうか。 実行計画などの結果を示し、改善方法を問うならまだしもですが、ご自身で試す事です。 何度も言っていますよ。 チューニングの基本としては、SQLの発行回数を少なくすることなので、ビューによりSQLを纏める事ができれば、チューニングの一歩とは言えるでしょう。 ただ、ビューにはインデックスを作成する事は出来ませんので、チューニングがし辛いと思います。 CTE(with式)が使えるバージョンなら、ビューよりチューニングはし易いと思います。
sazi

2021/05/26 05:41

解決積みの質問で質問内容とは趣旨の違う内容をコメントで質問するのではなく、新たな質問として下さい。
dreamers

2021/05/26 06:00

sazi様、ご回答ありがとうございます。 >解決積みの質問で質問内容とは趣旨の違う内容をコメントで質問するのではなく、新たな質問として下さい。 申し訳ございません、今後、留意致します。
guest

0

いろいろやり方はあると思います。ややトリッキーですが、以下のようなクエリが個人的には好みです。

SQL

1SELECT 2 MAX(CASE WHEN 属性='名前' THENEND) AS 名前, 3 MAX(CASE WHEN 属性='住所' THENEND) AS 住所 4FROM T2 5GROUP BY id 6HAVING MAX(CASE WHEN 属性='年齢' THENEND) >= 30;

これを実行すると、以下のような結果になります。

名前住所
山田大阪

投稿2021/05/25 12:37

neko_the_shadow

総合スコア2349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dreamers

2021/05/25 13:53

neko_the_shadow様、ご回答、ありがとうございます。 このようなクエリーがあるのですね、 ・現場では、t1のようなDBが一般的なのでしょうか、t2が一般的なのでしょうか、 ・レンタルサーバー(colorfulboxなど)を使用し、数十人が同時に使う状態で、データが10万件とかあった場合、今回のクエリーを実行した場合、レスポンスはザット、いかがなものと想定されるものでしょうか、 (フィールド項目は13項目でwhere条件2個くらい)
dreamers

2021/05/26 01:13 編集

※ 当方の勘違いの質問でしたので、質問を削除させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問