2011-07-23 84 views
2

我想要检索具有多种设施的属性。mysql AND子句在同一列多次

但是表结构是:属性在property表和设施与属性相关联。

设施表有:

id property_id amenity_name .... 

现在我想寻找的是有“停车”和“电梯”等设施。

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

我不想为此发射连接查询。

那么有人可以救我在这种情况下?

+0

选择PROPERTY_ID;将不会返回任何内容,因为名称不能同时包含两个值。你能否详细介绍一下你的桌子结构以及你想要达到的目标? –

+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 

这里的是怎么回事...

首先,获取有设施,你有兴趣的物业编号的列表:

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

然后缩小列表以仅包含那些属性ID的wh我有一个以上的舒适。按property_id进行分组,根据它们所属的property_id将结果捆绑到唯一的组中。然后,我们只需计算每个组中amenity_names的数量并检查它是否为2或更大。在上面的代码

GROUP BY property_id HAVING COUNT(amenity_name) >= 2

一个假设是,你不会有一个PROPERTY_ID不止一次相关联的同amenity_name。要消除与此相关的问题,请将HAVING子句更改为包含DISTINCT以清除重复项,但除非需要它才添加它。

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

+0

救了我。谢谢。 – BEm