2012-03-10 13 views
1

奇妙なタイトルは申し訳ありませんが、達成したいものを要約するのは簡単ではありません。私の目標は、「任意の」種類のデータを格納する一般的なテーブル構造を持ち、それを...自分自身で記述して、クエリの出力としてカスタムテーブルを取得することです。フィールド型とタイトルの値を持つカスタム構造体を返すMySQLクエリ

は、私がこのような構造を持つテーブルがある:

id (INT) 
idItem (INT) 
fieldTitle (VARCHAR) 
field (VARCHAR) 
value_label (VARCHAR) 
value_text (TEXT) 
value_bool (TINYINT) 
value_int (INT) 
value_float (FLOAT) 

テーブル内のデータの例:

idItem (INT) 
title (VARCHAR) 
description (TEXT) 
visible (TINYINT) 
price (FLOAT) 

id idItem fieldTitle field  value_label  value_text    value_bool value_int value_float 
-------------------------------------------------------------------------------------------------------------- 
1 15  title  value_label My Product One NULL     NULL  NULL  NULL 
2 15  description value_text NULL   Very good product... NULL  NULL  NULL 
3 15  visible  value_bool NULL   NULL     1   NULL  NULL 
4 15  price  value_float NULL   NULL     NULL  NULL  19.9 
5 16  title  value_label My Product Two NULL     NULL  NULL  NULL 
6 16  description value_text NULL   Just an hidden product. NULL  NULL  NULL 
7 16  visible  value_bool NULL   NULL     0   NULL  NULL 
8 16  price  value_float NULL   NULL     NULL  NULL  30 

が、私はこのような何かを持つ終了します

出力データの例:

idItem title   description    visible price 
15  My Product One Very good product... 1  19.9 
16  My Product Two Just an hidden product. 0  30 
+3

私はこれを行うことをおすすめします。 RDBMSであるMySQLは、基本的にこれを内部的に体系化しています。キーの関係、索引付け、または他のRDBMS機能を簡単に管理することはできないため、動的スキーマはほとんどの場合難しさと苦痛を軽減します。 –

+1

'ダイナミックなスキーマはほとんどの場合難易度と痛みの道にあなたを導くでしょう - >私は絶対に同意します。あなたがすでにその道にいる証拠は、あなたが非常に単純な情報を取得しなければならなかったこととStackOverflowに尋ねる必要があったということです:) –

+0

最初の答えとコメントありがとう!私の問題は、管理者が自分のカスタムフィールドを追加するCMSを開発しているので、私のテーブルのフィールドの「固定セット」から始めたくないということです(これは、lables、長いテキスト、yes/no、 (例えば、製品、連絡先、ニュースなど)を作成するために、挿入する列の数と数を予測することはできません。たぶん、あらゆる種類のデータ(ブーリアン、int、テキスト)のための*テーブルを作成し、それらのコレクションに要素を接続するための外部キーを作成する方が良いでしょうか? – flip79

答えて

0

私はあなたがこれを試してみることができます(あなたの質問以下の私のコメントを参照)スキーマのこの種に同意しないが:

select idItem, 
    max(if(fieldTitle = 'title', value_label, null)) Title, 
    max(if(fieldTitle = 'description', value_text, null)) Description, 
    max(if(fieldTitle = 'visible', value_bool, null)) Visible, 
    max(if(fieldTitle = 'price', value_float, null)) Price 
from t 
group by idItem 

これは、その結果:

+--------+----------------+-------------------------+---------+-------+ 
| IDITEM |  TITLE  |  DESCRIPTION  | VISIBLE | PRICE | 
+--------+----------------+-------------------------+---------+-------+ 
|  15 | My_Product_One | Very_good_product... |  1 | 19.9 | 
|  16 | My_Product_Two | Just_an_hidden_product. |  0 | 30 | 
+--------+----------------+-------------------------+---------+-------+ 

追加より多くのフィールドはまっすぐです。あなたに問題があるかどうか教えてください。

0

まず、MichaelとMostyの意見に同意します。なぜ特定のテーブルを持つのではなく、すべてのデータを格納するための一般的なテーブルを持つのが好きですか?以下のようなテーブル構造は、データをより整理し、クエリを簡単にします。

id INT 
title VARCHAR(255) 
description TEXT 
visible TINYINT 
price DECIMAL(5,2) 

第二に、あなたはあなたの構造と動作と仮定して、以下のクエリは、データ検索に役立つかもしれない:

SELECT `t`.`idItem`, `t`.`value_label` AS `title`, `t1`.`value_text` AS `description`, `t2`.`value_bool` AS `visible`, `t3`.`value_float` AS `price` 
FROM `your_table` `t` 
INNER JOIN `your_table` `t1` ON `t`.`idItem` = `t1`.`idItem` AND `t1`.`fieldTitle` = 'description' 
INNER JOIN `your_table` `t2` ON `t`.`idItem` = `t2`.`idItem` AND `t2`.`fieldTitle` = 'visible' 
INNER JOIN `your_table` `t3` ON `t`.`idItem` = `t3`.`idItem` AND `t3`.`fieldTitle` = 'price' 
WHERE `t`.`fieldTitle` = 'title'; 

はそれがお役に立てば幸いです。

関連する問題