【问题标题】:Sql query to check combinations and match it to the given combination用于检查组合并将其与给定组合匹配的 Sql 查询
【发布时间】:2011-07-20 17:22:37
【问题描述】:

我在 Sql 中有一个场景,我遵循架构。

如果我在 Item 表中有 3 个项目,则所有项目的一个唯一组合将分配给用户。例如:

项目: 1 2 3

那么组合将是:{1}、{2}、{3}、{1,2}、{1,2,3}、{1,3}、{2,3) 都是唯一的组合。 这些组合中的任何一个都将分配给单个用户。

现在我想找出给定的组合属于哪个用户,我怎样才能找到它?例如:我将传递项目列表 {2,3} 然后它应该从表 UserItemCombinations 返回具有该组合的用户 ID。 {2,3} 作为逗号分隔的字符串传递给 SP。我以 3 个项目为例,这个表可能包含 n 个项目。用户数量将取决于组合的数量。例如:三个项目有 7 个组合,因此用户表将有 7 个用户。

【问题讨论】:

  • n 可以有多大?例如,如果限制为 32 或 64,您可以使用位掩码以获得更好的性能
  • @Dmitry:它可能会达到 1k 或更多
  • UserItemCombinations 中的数据应该多久更改一次?编写将在用户的某些字段中缓存组合的 SP 或触发器是否有意义?那是因为我猜,如果查询是从头开始的,那就太费时了。
  • @Dmitry:该表中不会有任何更新,无论是删除还是添加,但即使这样也很少见

标签: sql-server stored-procedures mapping combinations


【解决方案1】:

UserItemCombinations 每个用户项会有一行,一个用户只能有一个组合,所以如果查询组合是 {2,3}

select userid from user where userid not in 
  (select distinct userid from UserItemCombinations where itemid in 
                 (select itemid from item where itemid not in (2,3));

【讨论】:

  • 对于任何特定的行,如果itemid in (2,3),我可以保证itemid not in (1,4,5,6,7),反之亦然。您需要考虑多行。
  • 我如何使用 [not in],因为这使我依赖于我无法控制项目数量的项目表。
  • @Damien_The_Unbeliever:你抓住了我......现在编辑
【解决方案2】:

如果UserItemCombinations 中没有太多更新,并且所需查询的性能足够关键,您将在User 表中创建附加字段,即Items,并创建为每个用户填写这些值的 SP .存储过程将在循环中为每个用户选择已排序的项目,并将它们连接成一个字符串以放入 User.Items 字段。您也可以在UserItemCombinations 上为INSERT, UPDATE, DELETE 触发并重新计算该值。

您也可以在该字段上创建索引。

【讨论】:

    【解决方案3】:

    从 UserItemCombinations 中选择用户 ID,其中 itemid 在 (2,3) 中并且 itemid 不在 (从itemid不在(2,3)中的Item中选择itemid);

    【讨论】:

    • 对于任何特定的行,如果itemid in (2,3),我可以保证itemid 不等于任何其他值。您需要考虑多行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2021-01-04
    • 2022-10-15
    相关资源
    最近更新 更多