2

私のMysqlデータベースには、オブジェクトタイプによって定義されたオブジェクトがあり、オブジェクトタイプを結合してそのプロパティを設定します。そして、それはスペンサーによって指摘されたエンティティ属性値モデルに基づいています。

データベースは以下よりも少し複雑ですが、これで私の質問がもう少し明確になるはずです。

objectsオブジェクトに関するいくつかの基本情報を含むmysqlテーブルがあります。たとえばcreate_date、、、titleそしてauthorもちろんid

object_propertiesオブジェクトに関するデータをさらに含むテーブルもあります。

それらを検索するのに問題があります。たとえば、オブジェクトには、end_datestart_dateを個別のプロパティとして持つ場合があります。これらはそれぞれ、に独自の行を持ちobject_propertiesます。

それぞれに独自の行があるため、終了日と開始日をどのように一致させるのでしょうか。

通常、私はこのようにクエリします。select * from table where start_date > value AND end_date < valueしかし、各プロパティは別々の行であるため、これを行うことはできません。

次のクエリを試しました。`

 select * 
  from object_properties 
 where object_id = 1 
   and (     (object_properties.type_id = 1)
         and (object_properties.value = 2) 
         and (     (object_properties.type_id = 2) 
               and (object_properties.value = 2)
             )
       )

上記の例ではtype_id = 1、が開始日とtype_id =2終了日になりますが、これは機能していないようです。私はそれを間違った見方をしていると思っていました。

質問のタイトルが間違っている可能性があることに気付きました。この方法でデータを保存する方法がよくわかりません。

マシューズの回答に基づいて使用したソリューションは次のとおりです。

これが私が最終的に得たものです: `

 SELECT   
      o.title,  
      o.id,  
      op1.value AS start_date,  
      op2.value AS end_date  
 FROM object o  
 JOIN object_meta_values op1 ON op1.object_id=o.id AND op1.object_type_meta_id=28  
 JOIN object_meta_values op2 ON op2.object_id=o.id AND op2.object_type_meta_id=29  
 WHERE object_type_id = 11  
 AND (12      <= op1.value AND op1.value <  16     )   
 OR (12       <  op2.value   AND op2.value   <= 16     )   
 OR (op1.value <= 12        AND 16        <= op2.value)  

`。どうもありがとう!

4

3 に答える 3

2

これを行うには、複数の左結合を使用できます。

SELECT 
    o.create_date,
    o.title,
    o.author,
    op1.value AS start_date,
    op2.value AS end_date,
    ...
FROM object o
LEFT JOIN object_properties op1 ON op1.object_id=o.object_id AND op1.type_id=1
LEFT JOIN object_properties op2 ON op2.object_id=o.object_id AND op2.type_id=2

プロパティを持たない値はnullになります。

このメソッドでは、プロパティを取得するために2番目のクエリを実行する必要もありません。

編集 null値を取得したくない場合は、のleft一部を省略してleft joinください。

于 2012-09-04T18:19:00.730 に答える
2

簡単な答えは、2つの行をプルする必要があるため、そのための1つの方法は、クエリを変更してANDORなどに置き換えることです。

select p.* 
  from object_properties p
 where p.object_id = 1 
   and (  
          (p.type_id = 1 and p.value = 2) 
       OR 
          (p.type_id = 2 and p.value = 2)
       )

(明らかに、これが唯一の方法ではなく、指定された結果セットを取得するための最良の方法であるとは限りません。ただし、このようなクエリを実行すると、2つの行が取得されます。)

扱っているデータモデルのタイプは、通常、「エンティティ-属性-値」モデル、または略してEAVモデルと呼ばれます。

于 2012-09-04T18:19:27.010 に答える
1

終了日と開始日が同じレコードを見つけるということですか?または、彼のプロパティを持つすべてのオブジェクトのリストが必要ですか?

PS行ではなく列にすべてのプロパティを保存してみませんか?オブジェクトテーブルを指す1つのプロパティIDで完了です。

于 2012-09-04T18:19:51.297 に答える