Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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,我试图从几个表中获取多个属性(例如卧室、浴室等)。是的,我的当前查询似乎只能获取一个属性。我错过了什么 我最终想要找到的是有两间浴室和两间卧室的房产。在本例中,我想要的结果是属性id的1和4 下面是我的例子 示例表: property -------- id 1 2 3 4 attribute --------- id name 1 bedrooms 2 bathrooms attribute_value --------------------- id attribute_id va

我试图从几个表中获取多个属性(例如卧室、浴室等)。是的,我的当前查询似乎只能获取一个属性。我错过了什么

我最终想要找到的是有两间浴室和两间卧室的房产。在本例中,我想要的结果是属性id的1和4

下面是我的例子

示例表:

property
--------
id 
1
2
3
4

attribute
---------
id name
1  bedrooms
2  bathrooms

attribute_value
---------------------
id attribute_id value
1  1            1
2  1            2
3  1            3
4  2            1
5  2            2
6  2            3

property_attributes
------------------------------
property_id attribute_value_id
1           2
1           5
2           2
2           4
3           1
3           4
4           2
4           5 
如果我只想查看基于单个属性的查询,则此查询可以生成我想要的结果:

SELECT p.property_id
FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_area pc ON p.property_id = pc.property_id
WHERE pa.attribute_value_id
IN (
SELECT av.attribute_value_id
FROM attribute_value av
INNER JOIN attribute a ON av.attribute_id = a.attribute_id
WHERE a.name like 'bedrooms' AND av.value like '2')
但我必须做些什么才能获得更多属性的结果(例如,a.name如“bathrooms”和av.value如“2”)呢?如果我在主where子句中添加另一个子查询,它不会返回任何结果

///编辑///

如果其他人最终陷入这种情况,以下是对我有效的解决方案:

SELECT p.property_id
FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_attribute pa2 ON p.property_id = pa2.property_id
INNER JOIN property_attribute pa3 ON p.property_id = pa3.property_id
WHERE pa.attribute_value_id = 2 
AND pa2.attribute_value_id = 5
AND pa3.attribute_value_id = 7

这就使用了一个自连接

模式中有大量的间接性。您需要
property\u属性
表的原因有哪些?您是否希望多个属性共享一个属性值

在任何情况下,这都是你的疑问。非常符合我上面提到的两个方面的精神

SELECT property.property_id,
       bedrooms.value AS bedrooms,
       bathrooms.value AS bathrooms
FROM property,
     attribute AS bedrooms_attr,
     attribute_value AS bedrooms,
     property_attribute AS bedrooms_prop,
     attribute AS bathrooms_attr,
     attribute_value AS bathrooms,
     property_attribute AS bathrooms_prop
WHERE bedrooms_attr.name = 'bedrooms'
  AND bedrooms.attribute_id = bedrooms_attr.attribute_id
  AND bedrooms.attribute_value_id = bedrooms_prop.attribute_value_id
  AND bedrooms_prop.property_id = property.property_id
  AND bedrooms.value = 2
  AND bathrooms_attr.name = 'bathrooms'
  AND bathrooms.attribute_id = bathrooms_attr.attribute_id
  AND bathrooms.attribute_value_id = bathrooms_prop.attribute_value_id
  AND bathrooms_prop.property_id = property.property_id
  AND bathrooms.value = 2

感谢您提供了大量数据。

可能重复的@MvG的可能重复,可能是名义上的重复,但关于我问题的内容,我看不出它和你建议的可能重复的内容有什么相似之处。这是一个多选择属性吗?这些属性/值与什么类型的事物相关?产品?你最终想要找到什么?特定值的特定浴室,也有3-5间卧室和2.5间浴室?我理解您遇到的问题,但如果您没有提供有关您试图排序的内容的详细信息,则很难想象解决方案。@RPM,您知道了,我正在尝试查找一个包含2个浴室和2个卧室的属性id。是的,属性将由多个属性共享。用户可以创建他们想要的任何属性。至于复制品,也许在精神上是可以的,但最终,它们对我毫无帮助。然而,我确实在这个网站上找到了一些有趣的想法,为充分的解决方案提供了想法。我会把它贴在上面。是的,我不知道sql FIDLE是否存在,但多亏了你,它现在已经是一个标准工具了。@BrandonMinton,你似乎在谈论许多属性共享的属性,即
属性
表中的行。这种分享非常有意义。我指的是属性值的共享,即
attribute\u value
表中的行。这种共享我认为是相当异乎寻常的,所以你也可以去掉<代码> PrimeTyAtgult<代码>,而在<代码>属性值表中包含<代码>属性Type ID <代码>。您可以删除
attribute\u value.id
,并将
(property\u id,attribute\u id)
设置为
attribute\u value
的组合主键。这是一个很好的建议。这个术语是规范化正确吗?@BrandonMinton,不确定命名法。规范化对于数据库设计来说是一个相当广泛的问题。我看不到需要我的方法的标准形式要求。我相信安会建议的。我还相信,您可能会违反,因为不同的属性可能有不同的域。克里斯蒂安·林迪格也写了很多。