我们如何使用搜索条件(..和..或..)来代替mysql中的列?

时间:2016-10-23 18:44:07

标签: php mysql entity-attribute-value

我正在开发一个php-mysql房地产项目,它几乎完成了。但是我在“详细的财产搜索”部分遇到了麻烦。我不知道我是否可以充分表达我的问题,但我会解释你们所有人。

在关键部分,我的项目中有3个表:“properties”,“property_details”和“features”。属性表存储有关每个属性的fundemantal信息,如id,title,category,sub category,city ext。 features表存储属性的所有可能的特殊功能。它有3列:id,title和value。标题栏引用另一个表,因此与此问题无关。最后,property_details表有3列:property_id,feature_id和value。你可以问我“为什么你在两个表中使用两次值列?”但是有些功能有固定的值(比如有没有车库),有些功能值是由用户输入的,比如房间数。

在“详细属性搜索”页面中,程序列出了所选属性类别的所有正确功能,并根据用户的选择,创建了一个长sql,条件如下:“(property_details.feature_id = 4和property_details.value< 10 )或者(...)和(...)分机。我的问题从这里开始,我知道mysql一行一行地运行查询,但是在我的property_details表中,一个属性可以多于一个并且具有太多不同的功能。但是我不能因为不同的行而使用我的where条件。有没有办法用我的特定“哪里”按列而不是行进行查询?或者任何其他建议?我将非常感谢你的帮助!

我想告诉你我到底需要什么: property_details表:

PROPERTY_ID | feature_id |值

 1     |     3      |  10
 1     |     4      |  11
 2     |     3      |  9
 1     |     2      | 200

我的桌子现在看起来像那样。我需要找到一个属性(feature_id = 3 AND feature_id = 4)或(feature_id = 2 AND值> 100)。我不能自然地提出这个问题。但我需要这样做。因为有许多不同的功能(大约400-500)并且使每个功能作为列是不合逻辑的。我需要这样使用这个表。

2 个答案:

答案 0 :(得分:1)

对于OR-condditions:

select distinct property_id
from property_details
where feature_id = 3 and value = 4
   or feature_id = 2 and value > 100

对于AND条件:

select property_id
from property_details pd
where feature_id = 3 and value = 4
   or feature_id = 2 and value > 100
group by property_id
having count(*) = 2

或使用联接:

select d1.property_id
from property_details d1
join property_details d2 using (property_id)
where d1.feature_id = 3 and d1.value = 4
  and d2.feature_id = 1 and d2.value > 100

搜索"实体 - 属性 - 值 - 模型"找到更多与此设计相关的问题和解决方案。

答案 1 :(得分:0)

你必须在这里使用EXISTS

SELECT * FROM   properties prp
WHERE EXISTS
(
    SELECT * FROM property_details pd
    WHERE  pd.property_id = prp.id
    AND    pd.feature_id = 3
)
AND EXISTS
(
    SELECT * FROM property_details pd
    WHERE  pd.property_id = prp.id
    AND    pd.feature_id = 4
)
OR EXISTS
(
    SELECT * FROM property_details pd
    WHERE  pd.property_id = prp.id
    AND    pd.feature_id = 2
    AND    pd.value > 100
)

它并不优雅,但这是使用EAV模型的结果。我根据经验知道有时候EAV是不可避免的,所以我不鼓励你不要使用它,但它在查询和呈现方面不会方便。