Mysql 使用“special”WHERE子句在一个sql查询中从表中选择数据

Mysql 使用“special”WHERE子句在一个sql查询中从表中选择数据,mysql,sql,Mysql,Sql,我在使用一个查询从表中选择正确的数据时遇到问题。我是 不确定是否能做到 properties: - id - name facilities: - id - name property_facilities: - property_id - facility_id 正如您在上面的模式中所看到的,每个属性可以有一个或多个属性 设施在代码中的某一点上,我需要一个属性ID列表 那里有一些设施 伪SQL: SELECT property_id FROM property_facilities WH

我在使用一个查询从表中选择正确的数据时遇到问题。我是 不确定是否能做到

properties:
- id
- name

facilities:
- id
- name

property_facilities:
- property_id
- facility_id
正如您在上面的模式中所看到的,每个属性可以有一个或多个属性 设施在代码中的某一点上,我需要一个属性ID列表 那里有一些设施

伪SQL:

SELECT property_id
FROM property_facilities
WHERE
  facility_id IN (8, 12)
显然这不起作用,因为我需要一个属性ID列表 拥有8号和12号设施,而不仅仅是其中一个。我怎样才能做到
这?

添加具有预期匹配id数的HAVING子句即可:

SELECT property_id
FROM property_facilities
WHERE facility_id IN (8, 12)
GROUP BY property_id
HAVING count(facility_id) = 2
但是,这确实假设property\u facilities表中没有重复的条目。如果您这样做了,您可以在子查询中使用DISTINCT来解决这个问题,或者简单地添加约束以首先不允许重复

下面是具有不同子查询的相同查询:

SELECT property_id
FROM (SELECT DISTINCT property_id, facility_id FROM property_facilities) distinct_rows
WHERE facility_id IN (8, 12)
GROUP BY property_id
HAVING count(facility_id) = 2
怎么样

从属性id所在的属性中选择属性id 从property\u设施中选择property\u id

这将生成所有具有任何设施的属性ID的列表,而不仅仅是8或12

编辑:如果您试图获取包含设施8和设施12的属性列表,则可以执行以下操作:

select property_id from properties where property_id in 
(select property_id from property_facilities where facility_id = 8) and property_id in
(select property_id from property_facilities where facility_id = 12)

这不管用。我仍然会得到包含facility 8但不包含facility 12的属性id。首先,您不应该在SELECT子句中包含facility_id,因为该行表示多个facility_id。如果需要,可以选择property\u id、countfacility\u id以查看找到多少匹配行。其次,您能否验证表中是否有重复的行?是的,1249属性同时具有设施8和12。我将facility_id添加到查询中只是为了显示结果,因为我没有得到预期的结果。对于只有8行或12行但没有两者的属性,能否检查表中是否有多个这样的行?例如,从property_facilities中选择*,其中property_id=123假设123不同时具有这两个属性。使用独特的子查询应该对上面添加的内容有所帮助。我可以确认您的查询按预期工作。谢谢你优雅的解决方案。