获取联接表结果的MySQL查询
有可能有人问过这个问题,但我不完全确定如何用词,这使得寻找答案有点困难 我有一个住宿列表(listingid(主键)、列表名称、描述等)。然后,我有另一个与每个列表相关的属性表(attributeid(主键)、listingid、attribute)。每个属性在表中占据自己的行-我意识到这可能更聪明,但继承了数据结构 我想要实现的例子是:获取联接表结果的MySQL查询,mysql,sql,Mysql,Sql,有可能有人问过这个问题,但我不完全确定如何用词,这使得寻找答案有点困难 我有一个住宿列表(listingid(主键)、列表名称、描述等)。然后,我有另一个与每个列表相关的属性表(attributeid(主键)、listingid、attribute)。每个属性在表中占据自己的行-我意识到这可能更聪明,但继承了数据结构 我想要实现的例子是: SELECT all listings where attributes have "WiFi" AND "Air Conditioning" AND "Sw
SELECT all listings where attributes have "WiFi" AND "Air Conditioning" AND "Swimming Pool"
除了这些必须具备的属性外,我只想返回符合以下任一条件的列表:“汽车旅馆”、“酒店”、“公寓”
我最初在attributes表上进行内部联接,然后转到其中(attribute=“X”和attribute=“Y”)和(attribute=“XX”或attribute=“YY”)
,但意识到该语句的开头永远不会匹配多行,因为它只会检查一行。所以需要考虑连接的整个结果(或者子查询?),这是我需要扩展SQL理解的地方。
我真的不想走我的典型路线,创建x个数量的子查询,因为我认为这将使整个查询非常缓慢-特别是如果用户选择了十几个或更多的属性进行搜索
希望这足以说明问题,但如果您需要更多信息,请告诉我。类似的方法应该可以:
select
acc.*
from
accomodation acc
join attribute air on acc.id = air.accomodation_id and air.name='Air'
join attribute pool on acc.id = pool.accomodation_id and pool.name='Pool'
and acc.type in ('Motel', 'Hotel', 'Appartment')
;
已假定符合您的条件的列名。但这应该可以满足您的需要。您是否建议我对正在搜索的每个属性进行表连接?这可能等于同一个表上的12个或更多连接-这是您的意图吗?如果是这样的话,我很好,但我只关心运行查询所需的时间。如果有外键或其他适当的索引,即使对于非常大的表,联接也应该非常高效和快速。是的,它最初看起来在我的暂存站点上运行得很好。明天我会把它推到生产现场,看看进展如何。谢谢很有魅力谢谢约翰!我没有注意到增加额外的连接在速度上有任何差异。再次感谢。我在中发现的问题是,它只需要匹配其中一个值,而不是所有值。第一部分需要匹配所有变量,而第二部分可以匹配任何变量。仅供参考。第二部分l.说明也是一个属性,因为它们也存储为属性。对于第一个条件,使用
和对其进行了修改
select l.listingid, l.listing_name
from listings l join attributes a
on l.listingid = a.listingid
where a.attribute = 'WiFi'
and a.attribute = 'Air Conditioning' and a.attribute = 'Swimming Pool'
and l.description in ('Motel', 'Hotel', 'Apartment')