【问题标题】:Search through Users with dynamic attributes with SQL使用 SQL 搜索具有动态属性的用户
【发布时间】:2014-02-04 20:45:06
【问题描述】:

.您好,我正在使用 Asp 和 SQL-Server,编写动态查询没有问题

我正在尝试编写一个搜索页面来搜索人。

我有 3 个相关的表: 请参阅我的表格图:http://tinypic.com/r/21159go/5

我想做的是设计一个搜索页面,人们可以搜索具有动态数量属性的用户。

示例: 认为名为“User1”的用户名在“UserAttributes”表中具有与他相关的 3 个属性,分别名为“Attr1”、“Attr2”和“Attr3”,而“User2”有 3 个名为“Attr1”、“Attr2”和“Attr4”的属性. 属性名称和其他与搜索功能无关的项目保存在“属性”表中。这是因为我想在多个用户之间关联一个属性。并且它们的值存储在“UserAttributes”表中。 好吧,有人想搜索“Attr1”和“Attr2”,并希望返回所有具有“Attr1”和“Attr2”且具有特定值的用户。

我需要一个查询来了解如何实现它。我可以用 asp.net 编写一个动态查询,所以如果有人请给我一个关于我带来的这个例子的查询,我将不胜感激

附:这不是我真正的数据库。我的真实数据库要复杂得多,并且有更多的字段和表格,但我只是把它剪掉了,只带了必要的项目。并且因为属性是非常动态的,它们不能嵌入到表格列中。

提前致谢

【问题讨论】:

  • 这可以作为关系除法问题来解决。但大多数人会建议不要使用EAV 设计。
  • 看看 Linq to Sql,它提供了一种优雅的方式来从您的应用程序中定义 where 子句。您还可以使用 Lucene 从您的数据中生成更可查询的索引。

标签: sql sql-server


【解决方案1】:

根据您的数据库图,您的代码将是这样的

更新:

SELECT u.*
FROM users AS u
LEFT OUTER JOIN UserAttributes AS ua1
    ON u.USER_ID = ua1.USER_ID
LEFT OUTER JOIN UserAttributes AS ua2
    ON u.USER_ID = ua2.USER_ID
WHERE (
        ua1.attribute_id = 'att1'
        AND ua.attribute_value = 'MyValue' )
    AND (
        ua2.attribute_id = 'att2'
        AND ua.attribute_value = 'MyValue2' )

在 where 子句中,您将指定 attirbute_Id 以及您期望从中获得的值。不仅仅是决定是否要限制用户让所有值匹配或只匹配其中一个,在这种情况下,将语句之间的 AND 修改为 OR

  • 如果您只是想快速而肮脏地执行此操作,您可以创建自己的类库,该类库可以创建将传递给数据库的临时 sql。
  • 如果您想要更有条理的事情,请创建将带回用户并接受任何剩余 id 和 value 的 SP。通过传递以逗号、冒号或分号分隔的列表来做很多事情。然后将其拆分为 SP 并根据这些值过滤结果
  • 还有许多其他替代方案,如 EntityFramework、LINQ-to-SQL 和其他选项,只需要弄清楚什么最适合您,您想在上面花费多少时间以及以后支持它的难易程度。

【讨论】:

  • 我试过了,但没有用。因为attribute_id 必须同时等于att1 和att2,这是不可能的。并且 OR 也不起作用,因为它返回至少有一个 match 的所有属性。但我需要匹配所有的行。无论如何,我尝试使用带有 OR 的 Count 函数并使用匹配属性的数量对其进行过滤。它有效,但我不喜欢这个解决方案,因为也许有更好的解决方案。
  • 抱歉有点糊涂,因为您试图同时检查两个不同的属性,您需要加入该表两次。试试我现在的查询,应该可以。
猜你喜欢
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多