SQL Server IF ELSE从计数中选择随机项

SQL Server IF ELSE从计数中选择随机项,sql,sql-server,Sql,Sql Server,我在一家网店工作,我找不到正确的方法,只使用一个查询,就可以根据他们共享的类别显示4个类似的随机产品。每个产品有3个级别的类别 我需要检查的产品中的列有产品id、类别1、类别2、类别3 我想做一个if-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-el

我在一家网店工作,我找不到正确的方法,只使用一个查询,就可以根据他们共享的类别显示4个类似的随机产品。每个产品有3个级别的类别

我需要检查的产品中的列有产品id、类别1、类别2、类别3

我想做一个if-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-elseif-El

我目前正在使用我的服务中的一个交换机来实现这一点,我想知道,如果是最糟糕的情况,使用1个查询(目前有4个查询)是否真的会有好处

编辑:表达式ABSCASTBINARY_CHECKSUM**RAND as int%100<10将返回一个从1到99的数字。RAND将给出一个介于0和1之间的浮点值,BINARY_CHECKSUM根据您的调用给出一个整数。CAST将返回一个变量作为您在本例中选择的int类型。对其进行模运算和比较

对于我的查询,我使用了NEWID,因为这是SQL Server获取随机行的方法

select 
top 4
    product_id,
    class1, 
    class2, 
    class3
from 
(
select 
    product_id,
    class1, 
    class2, 
    class3,
    level=1
from products 
where  
  class3=@class3_value
  and product_id<>@product_id
    UNION 
select 
    product_id,
    class1, 
    class2, 
    class3,
    level=2
from products 
where  
  class2=@class2_value
  and product_id<>@product_id
    UNION
select 
    product_id,
    class1, 
    class2, 
    class3,
    level=3
from products 
where  
  class1=@class1_value
  and product_id<>@product_id
 ) T
order by NEWID()

您可以尝试下面这样的查询。假设您当前的产品id是类别信息,可以作为参数进行查询

select 
     TOP 4
        product_id,
        category_class_1, 
        category_class_2, 
        category_class_3
    from 
    (
    select 
        product_id,
        category_class_1, 
        category_class_2, 
        category_class_3,
        level=1
    from products 
    where  
      category_class_3=@Category_class_3
      and product_id<>@product_id
      and (ABS(CAST(
      (BINARY_CHECKSUM(*) *
      RAND()) as int)) % 100) < 100

        UNION 

    select 
        product_id,
        category_class_1, 
        category_class_2, 
        category_class_3,
        level=2
    from products 
    where  
      category_class_2=@Category_class_2
      and product_id<>@product_id
      and (ABS(CAST(
      (BINARY_CHECKSUM(*) *
      RAND()) as int)) % 100) < 100

        UNION

    select 
        product_id,
        category_class_1, 
        category_class_2, 
        category_class_3,
        level=3
    from products 
    where  
      category_class_1=@Category_class_1
      and product_id<>@product_id
      and (ABS(CAST(
      (BINARY_CHECKSUM(*) *
      RAND()) as int)) % 100) < 100
    )T
    order by T.level asc

你能告诉我们到目前为止你做了什么吗?有一些代码和数据。你正在寻找一个案例陈述。我只是部分地遵循了你的逻辑,你能展示一些表格/数据的例子吗,你尝试了什么以及想要的结果?这里是一个很好的起点。很抱歉,我没有发布任何查询,这里有很多where子句,比如:$switchSelect=$adapter->select->fromarrayself::TABLE_NAME,array'id'=>'product_id'->where'product_id',$productId->where'class2=,$levelTwo->ordernew Zend_Db_Expr'RAND'->limit4$similarProducts=$adapter->fetchAssoc$switchSelect;对于每个开关箱。我还不熟悉Zend和这个复杂的表达式。感谢您快速回复DhruvJoshi。这是完美的工作。请接受我的回答作为正确的答案,如果它为你工作-以便其他用户可以受益:从知道答案的工作,并有问题标记为回答。问题是它总是选择相同的4个产品。abscastBINARY_校验和**RAND AS int%100将始终返回小于100的值。当我发布我的第一个回复时,我不知道二进制校验和和和ABS是用来做什么的。你可以更改值,因为你帮了大忙。再次感谢。