Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取联接表结果的MySQL查询_Mysql_Sql - Fatal编程技术网

获取联接表结果的MySQL查询

获取联接表结果的MySQL查询,mysql,sql,Mysql,Sql,有可能有人问过这个问题,但我不完全确定如何用词,这使得寻找答案有点困难 我有一个住宿列表(listingid(主键)、列表名称、描述等)。然后,我有另一个与每个列表相关的属性表(attributeid(主键)、listingid、attribute)。每个属性在表中占据自己的行-我意识到这可能更聪明,但继承了数据结构 我想要实现的例子是: SELECT all listings where attributes have "WiFi" AND "Air Conditioning" AND "Sw

有可能有人问过这个问题,但我不完全确定如何用词,这使得寻找答案有点困难

我有一个住宿列表(listingid(主键)、列表名称、描述等)。然后,我有另一个与每个列表相关的属性表(attributeid(主键)、listingid、attribute)。每个属性在表中占据自己的行-我意识到这可能更聪明,但继承了数据结构

我想要实现的例子是:

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')