我们如何在 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是不可避免的,所以不劝大家不要用,但是查询和展示永远不方便。