SQL Server IF ELSE从count中选择随机项

时间:2017-10-03 17:52:21

标签: sql sql-server

我正在网上商店工作,我找不到使用1个查询的正确方法,以便根据共享类别调出4个类似的随机产品。每种产品有3个级别的类别。

我需要检查的产品中的列是product_idcategory_class_1category_class_2category_class_3

我想做一个if elseif elseif其他类型的条件,其中我带来4个具有相同category_class_3的产品,如果它小于4则将其余产品从同一category_class_2带来,如果它更少如果少于4个来自任何随机产品,则从category_class_3带来剩余的4个。

我目前正在使用我的服务中的一个开关执行此操作,并且我想知道这是否实际上只有1个查询有效,目前有4个查询,如果是最糟糕的情况。

编辑:表达式(ABS(CAST((BINARY_CHECKSUM(*)* RAND())为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()

1 个答案:

答案 0 :(得分:0)

您可以尝试如下查询。假设您当前的product_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