1

これが可能かどうかはわかりませんし、説明するのは確かに難しいです。

SELECT次の方法でクエリを返したいと思います。

pID | 名前 | メール | 犬の名前 | 魚の名前
-------------------------------------------------- -----
44 | ジョン | ジョン | john@email.com | だらしない |
56 | ジェーン | jane@email.com | | | フグ
72 | ジョー | ジョー | joe@email.com | スパーキー | ギル

3 つのテーブルがあります。 tbl_option_fields tbl_person tbl_person_optionals

最初のテーブルは、単純に無制限のオプション フィールドを定義しています。列は次のとおりです。

オプティッド | opttitle
------------------
1 | 犬の名前
2 | 魚の名前
3 | Eメール

2 番目のテーブルは単純に、人々のデータを保持する場所です。

pID | 名前
---------------
44 | ジョン
56 | ジェーン
72 | ジョー  

最後のテーブルには、pID

ID | pID | オプティッド | オプトヴァル
----------------------------------
1 | 44 | 1 | みすぼらしい
2 | 56 | 2 | フグ
3 | 72 | 1 | スパーキー
4 | 72 | 2 | ギル
5 | 72 | 3 | joe@email.com
6 | 56 | 3 | jane@email.com
7 | 44 | 3 | john@email.com

SELECT ステートメントの結果はopttitle、結果のヘッダーに表示される必要があります。私はサブクエリが苦手で、これは大変なことかもしれません。

これが私の試みです:

SELECT p.*, opt.optval
FROM `tbl_person` p
LEFT OUTER JOIN `tbl_person_optionals` opt ON p.pID = opt.pID 
WHERE 1 

このクエリにより結果が重複しますが、その理由は理解できたと思います。

pID | 名前 | オプトヴァル            
------------------------------
44 | ジョン | ジョン | john@email.com   
44 | ジョン | ジョン | みすぼらしい   

56 | ジェーン | jane@email.com
56 | ジェーン | フグ

72 | ジョー | ジョー | joe@email.com  
72 | ジョー | ジョー | スパーキー  
72 | ジョー | ジョー | ギル

行に新しいレコードを表示するのではなく、オプション フィールドを水平方向に表示したいということを説明できれば幸いです。これはできますか?

4

3 に答える 3

0

基本的に欲しいのはピボットテーブルです。これは、この記事で詳細に説明されているように、MySQL で実行できます。

ただし、現在のテーブル設計で必要なものをアーカイブするには、テーブルにあるすべてのオプションにSELECT-operatorを追加する必要があります。いくつかのオプションだけでこれは管理可能ですが、オプションが多いほど、ステートメントが乱雑になります (そして最終的には実行が遅くなります)。tbl_option_fields

別の欠点は、新しいオプションが登場するたびにステートメントを調整する必要があることです.

基本的に、それを受け入れるか、テーブルのデザインを調整する必要があります。他にもいくつかオプションがあるかもしれませんが、要約すると、この 2 つに集約されると思います。

于 2013-07-10T19:54:24.763 に答える