2011-07-23 5 views
2

複数のアメニティを持つプロパティを取得しようとしています。同じ列に複数のmysql AND節がある

テーブルの構造は:プロパティはpropertyテーブルにあり、アメニティはプロパティに関連付けられています。

アメニティテーブルがあります。

id property_id amenity_name .... 

今私はそうで「駐車場」と「エレベーター」とを持つ設備を検索します。

select property_id from amenities where name = 'parking' and name = 'elevator'; 

私はこのために結合クエリを起動したくありません。

誰でもこの状況で私を救うことができますか?

+0

名= '駐車場' と名前が= 'エレベーター' 設備から選択PROPERTY_ID。 nameは両方の値を同時に持つことができないので何も返しません。テーブル構造の詳細と達成したいことを少し詳しく説明できますか? –

+3

また、誰かがあなたに答え続けることを願っている場合は、何らかの答えを受け入れることを検討してください。 ;) –

+1

あなたが役に立つ答えを見つけたら、それを受け入れて、人々が将来あなたの質問を読むようにします。 –

答えて

1

これを試してみてください - :

scope :amenity_type, lambda {|term| 
      where("amenities.name" => term).joins(:amenities).group("amenities.property_id").having("count(amenities.name) >= #{term.size}") unless term.blank? 
    } 
+0

こんにちはVivek、助けてくれてありがとう。それはちょうど働いた:) –

4
select property_id 
from amenities 
where name in ('parking','elevator') 
group by property_id 
having count(distinct(name)) = 2 
+0

おかげで多くのニックネーム...これはうまくいきます:)。もう一度、ありがとうございます –

+2

よろしくお願いします。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work;) –

6

これを試してみてください:

SELECT property_id FROM amenities 
WHERE amenity_name IN ('parking', 'elevator') 
GROUP BY property_id 
HAVING COUNT(amenity_name) >= 2 

はここで何が起こっているのです...

まず、あなたが興味を持っているの設備を持っているプロパティIDの一覧を取得:

SELECT property_id FROM amenities WHERE amenity_name IN ('parking', 'elevator')

次に、プロパティIDのwhだけを含むようにリストを絞り込みますichは複数のアメニティを持っています。 property_idを使用してグループ化すると、結果が属しているproperty_idに基づいて結果が一意のグループにまとめられます。次に、各グループのアメニティ名の数を数え、それが2以上であるかどうかを確認するだけです。上記のコードで

GROUP BY property_id HAVING COUNT(amenity_name) >= 2

一つの仮定を使用すると、複数回PROPERTY_IDに関連付けられている同じamenity_nameを持っていないということです。それに関連する問題を解消するには、DISTINCTを含めるようにHAVING句を変更して、重複を除外しますが、必要がない限り追加しないでください。

GROUP BY property_id HAVING COUNT(DISTINCT(amenity_name)) >= 2

+0

保存しました。ありがとう。 – BEm

関連する問題