SQL Server IF ELSE从计数中选择随机项
我在一家网店工作,我找不到正确的方法,只使用一个查询,就可以根据他们共享的类别显示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获取随机行的方法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
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是用来做什么的。你可以更改值,因为你帮了大忙。再次感谢。