我正在网上商店工作,我找不到使用1个查询的正确方法,以便根据共享类别调出4个类似的随机产品。每种产品有3个级别的类别。
我需要检查的产品中的列是product_id
,category_class_1
,category_class_2
,category_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()
答案 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