我们如何在 mysql 中对列而不是行使用搜索条件(.. 和 ..or..)?
How can we use search conditions (.. and ..or..) for columns instead of rows in mysql?
我正在做一个 php-mysql 房地产项目,快完成了。但是我在 "detailed property search" 部分遇到了麻烦。我不知道我的问题是否可以充分表达我的问题,但我会解释给大家。
在关键部分,我的项目中有 3 个 table:"properties"、"property_details" 和 "features"。属性 table 存储有关每个属性的基本信息,如 id、标题、类别、子类别、城市分机。 features table 存储属性的所有可能的特定特征。它有 3 列:id、title 和 value。标题栏引用了另一个table,所以与本题无关。最后,property_details table 有 3 列:property_id、feature_id 和值。你可以问我 "why you use value column twice in two tables?" 但有些特征有固定值(比如有没有车库),有些特征值是由用户输入的,比如房间数。
在 "detailed property search" 页面中,程序列出了所选 属性 类别的所有适当功能,并根据用户的选择,它创建了一个长 sql where 条件,例如:“(property_details.feature_id = 4 and property_details.value < 10) Or (...) And (...) ext. 我的问题从这里开始,我知道 mysql 逐行运行查询,但在我的 property_details table,一个 属性 可以不止一个,并且有太多不同的特征。但是我不能使用我的 where 条件,因为行不同。有没有办法用我的 specific 进行查询"where" 按列而不是行的条件?或任何其他建议?我将不胜感激你的帮助!
我想告诉你我到底需要什么:
property_details table:
property_id| feature_id |值
1 | 3 | 10
1 | 4 | 11
2 | 3 | 9
1 | 2 | 200
我的 table 现在看起来是这样的。我需要找到一个 属性 其中 (feature_id = 3 AND feature_id = 4) 或 (feature_id = 2 AND value > 100)。我不能自然地提出这个问题。但我需要做。因为有很多不同的特征(大约 400-500)并且将每个特征都作为一列是不合逻辑的。我需要这样使用 table。
对于 OR 条件:
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
搜索 "Entity-Attribute-Value-Model" 以查找与此设计相关的更多问题和解决方案。
你必须在这里使用 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是不可避免的,所以不劝大家不要用,但是查询和展示永远不方便。
我正在做一个 php-mysql 房地产项目,快完成了。但是我在 "detailed property search" 部分遇到了麻烦。我不知道我的问题是否可以充分表达我的问题,但我会解释给大家。
在关键部分,我的项目中有 3 个 table:"properties"、"property_details" 和 "features"。属性 table 存储有关每个属性的基本信息,如 id、标题、类别、子类别、城市分机。 features table 存储属性的所有可能的特定特征。它有 3 列:id、title 和 value。标题栏引用了另一个table,所以与本题无关。最后,property_details table 有 3 列:property_id、feature_id 和值。你可以问我 "why you use value column twice in two tables?" 但有些特征有固定值(比如有没有车库),有些特征值是由用户输入的,比如房间数。
在 "detailed property search" 页面中,程序列出了所选 属性 类别的所有适当功能,并根据用户的选择,它创建了一个长 sql where 条件,例如:“(property_details.feature_id = 4 and property_details.value < 10) Or (...) And (...) ext. 我的问题从这里开始,我知道 mysql 逐行运行查询,但在我的 property_details table,一个 属性 可以不止一个,并且有太多不同的特征。但是我不能使用我的 where 条件,因为行不同。有没有办法用我的 specific 进行查询"where" 按列而不是行的条件?或任何其他建议?我将不胜感激你的帮助!
我想告诉你我到底需要什么: property_details table:
property_id| feature_id |值
1 | 3 | 10
1 | 4 | 11
2 | 3 | 9
1 | 2 | 200
我的 table 现在看起来是这样的。我需要找到一个 属性 其中 (feature_id = 3 AND feature_id = 4) 或 (feature_id = 2 AND value > 100)。我不能自然地提出这个问题。但我需要做。因为有很多不同的特征(大约 400-500)并且将每个特征都作为一列是不合逻辑的。我需要这样使用 table。
对于 OR 条件:
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
搜索 "Entity-Attribute-Value-Model" 以查找与此设计相关的更多问题和解决方案。
你必须在这里使用 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是不可避免的,所以不劝大家不要用,但是查询和展示永远不方便。