我正在开发一个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表:
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)并且使每个功能作为列是不合逻辑的。我需要这样使用这个表。
答案 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是不可避免的,所以我不鼓励你不要使用它,但它在查询和呈现方面不会方便。