人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLについて質問です。
以下の3つのテーブルがあるとします。

users
-------------
id(pk) | name
-------------
1 | bob
2 | mary

user_defined_columns
------------------------
id(pk) | name | enabled
------------------------
1 | Mail | 1
2 | Tel | 1
3 | | 0

column_values
----------------------------------------------------------
id(pk) | user_id(fk) | user_defined_column_id(fk) | value
----------------------------------------------------------
1 | 1 | 1 | bob@example.com
2 | 1 | 2 | 000-111-222
3 | 2 | 1 | mary@example.com


このときにユーザのリストを作成しようと思っています。
しかし、以下のようにuser_defined_columnsに定義された値を
ユーザリストのカラムとして表示したいです。

results
-----------------------------------------------
id(pk) | name | Mail | Tel
-----------------------------------------------
1 | bob | bob@example.com | 000-111-222
2 | mary | mary@example.com |

この場合はどのようなSQLを書くとよいのでしょうか?
このような場合はやはりアプリケーション側で対処すべきでしょうか?

●質問者: bobchin
●カテゴリ:ウェブ制作
✍キーワード:BOB example.com FK name PK
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● やん2
●35ポイント

SQLを工夫してお望みの結果は得られると思いますが、おそらく電話番号を複数持ったりFAX番号を管理したりということも考えているようなDB設計であると見受けられます。

このような項目拡張があった場合でもDBの変更が必要ないような工夫をされたのだと思います。

このようなテーブル構成の場合は、無理してSQL一本で望み通りの結果を得るよりも、column_valuesテーブルとusersとuser_defined_columnsを素直にjoinして得られた結果をアプリケーション側で整形した方が良いと思います。

◎質問者からの返答

回答ありがとうございます。

user_defined_columnsについては、1ユーザは各項目に対して1つしかデータを持たないつもりです。

ただし、user_defined_columnsの項目については後に増えることを想定しています。

また、結果として1つの表にしたいのは、ユーザリストを表示した際にソートをかけたいと考えていますので、1つの表にできればorder by1発なので楽かなとかんがえているためです。


2 ● KUROX
●35ポイント

results

-----------------------------------------------

id(pk) | name | Tyoe |TypeName| value

-----------------------------------------------

1 | bob | 1 |MAIL |bob@example.com

1 | bob | 2 |TEL |000-111-222

2 | mary| 1 |MAIL | mary@example.com

までSQLで、後はプログラム対応。

user_defined_columns

は将来増えることを想定してるのなら、SQLで一気にというのは

なんとなく危険そうな(単に直感)。

実際問題、1はMAIL、2はTELというようにDBの中身の値を

意識してプログラムしなければいけない局面がでてくると思う

ので、ここで、頑張ってもあまり意味がなさそうにも思う。

(これも、単に直感)。

下手にLEFT JOINするより、プログラムループしたほうが

マシそう。(これも、単に直感)

性能とか要求するのなら、

本当は、テーブル見直してほしいような気もします。

ここまで汎用性を持たせる必要はあるのかなとは思います。

◎質問者からの返答

回答ありがとうございます。

もしテーブル設計に問題があれば、設計の見直しもしたいと思っています。

上記にも書きましたが、結果として1つの表にしたいのは、

ユーザリストを表示した際のソート処理が楽になるのではないかと考えているためです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ