【问题标题】:TSQL change in query to and queryTSQL 在查询到和查询中的变化
【发布时间】:2015-02-04 10:15:42
【问题描述】:

我有一对多的关系表

ReviewId     EffectId
1       |    2
1       |    5
1       |    8
2       |    2
2       |    5
2       |    9
2       |    3
3       |    3
3       |    2
3       |    9

在网站中,用户选择他选择的每个效果,我得到所有相关的评论。 我做了一个in 查询 例如,如果用户选择效果 2 和 5 我的查询:“

select reviewed from table_name where effected in(2,5)

现在我需要获得所有包含这两种效果的评论 所有具有效果 2 和效果 5 的评论 进行此操作的最佳查询是什么? 对我来说重要的是查询将尽可能快地运行。 为此,我还可以更改表架构(如果需要),例如添加一个包含所有效果的缓存字段,如

Reviewed      cachedEffects
1          |  ,2,5,8
2          |  ,2,5,9,3,
3          |  ,3,2,9

【问题讨论】:

  • 你想要什么输出
  • 你现在的设计没问题。不管风雨无阻,不要改成逗号分隔。

标签: sql sql-server performance tsql


【解决方案1】:

你可以这样做:

 select reviewid
 from 
 tbl
 where effectid in (2,5)
 group by reviewid
 having count(distinct effectid) > 1

Demo

count (distinct effectid) 用于确保结果仅包含那些具有不同值effectID 的多条记录的reviewIDs。 where 子句用于根据您同时具有 2 和 5 的过滤条件进行过滤。

这里要注意的关键是我们按reviewID 分组,并且还使用不同effectID 值的计数来确保只返回那些同时具有2 和5 的记录。如果我们不这样做,查询将返回所有 effectID 等于 2 或 5 的行。

为了提高性能,您可以在 reviewID 上创建索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-05-23
    • 2023-04-07
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多