1

我正在尝试为复杂的搜索场景构建 SQL 语句,我需要你们的帮助。场景是:

我正在尝试提供一项服务,商家将注册它并提供他们将为每种产品提供的最佳价值(最多的钱),然后用户可以提供他们的位置并提供每种产品的多少/多少公斤他们拥有并将他们的值输入到输入表单中,然后我希望我的 SQL 列出所有商家以及他们将提供的总金额,其中大部分将从顶部开始。

我有一个包含 Merchants 表和 MerchantProducts 表和 Locations 表的数据库。每个商家有 20 种产品,这些产品对于每个商家来说都是一样的,

Merchant Table I have:
UserID (which is merchant's unique id)
MerchantName
MerchantTelNo
MerchantIsActive

MerchantProducts Table I have:
MerchantProductID
UserID
MerchantProductName
MerchantProductValue
MerchantProductLastUpdated

我想做的是:

1- 我有一个产品表单,用户可以在其中输入他们拥有的产品数量。这是一个产品列表,仅包含产品名称(标签)和数量(文本框)。产品的数量将乘以产品的价值。

2-用户将输入他/她的位置。

3- SQL 填充找到附近的商家,并将它们列出在顶部列出的最多和下面列出的最少的位置。

到目前为止,我已经完成了用户只选择一种产品并输入他们的位置,我将获得一个提供最多金额的商家的回报。我已经通过以下 SQL 存储过程完成了这项工作:

ALTER PROCEDURE [dbo].[GetNearbyLocations2] 
@ChosenProduct VARCHAR(100),
@CenterLatitude FLOAT, 
@CenterLongitude FLOAT, 
@SearchDistance FLOAT, 
@EarthRadius FLOAT AS DECLARE @CntXAxis FLOAT DECLARE @CntYAxis FLOAT DECLARE @CntZAxis FLOAT 
SET @CntXAxis = COS(RADIANS(@CenterLatitude)) * COS(RADIANS(@CenterLongitude)) 
SET @CntYAxis = COS(RADIANS(@CenterLatitude)) * SIN(RADIANS(@CenterLongitude)) 
SET @CntZAxis = SIN(RADIANS(@CenterLatitude)) 


SELECT TOP 100 *,
ProxDistance = @EarthRadius * ACOS( dbo.XAxis(latitude, longitude)*@CntXAxis + dbo.YAxis(latitude, longitude)*@CntYAxis + dbo.ZAxis(latitude)*@CntZAxis) 
FROM MerchantProducts AS M INNER JOIN Locations AS L ON M.UserID = L.UserID INNER JOIN (SELECT MAX(M.MerchantProductValue) AS MerchantProductValue FROM Locations AS L LEFT OUTER JOIN MerchantProducts AS M On L.UserID = M.UserID 
WHERE (M.MerchantProductName = @ChosenProduct AND @EarthRadius * ACOS( dbo.XAxis(latitude, longitude)*@CntXAxis + dbo.YAxis(latitude, longitude)*@CntYAxis + dbo.ZAxis(latitude)*@CntZAxis) <= @SearchDistance))
AS MX ON M.MerchantProductValue = MX.MerchantProductValue
AND M.MerchantProductName = @ChosenProduct
AND latitude IS NOT NULL ORDER BY ProxDistance ASC

我正在尝试创建一个存储过程来完成否。1,2 & 3. 基本上我希望用户输入他们对每种产品有多少公斤的产品,然后我希望 sql 遍历每个商家并找出哪个商家将为所有人提供最多的总金额用户在列表中输入值的那些产品。

在此先感谢,我希望我能解决我的问题。

4

1 回答 1

0

我相信您所描述的是一个优化问题,您“根据位置和价格填写订单”。我认为您可能希望为每个距离分配“运输成本”,否则您可能无法同时优化最佳价格和最佳位置。

对于单个产品,您可以使用可以使用 SQL Server 中的通用表表达式编写的递归查询来优雅地解决这个问题。CTE 中的第一个种子行将是用户的位置和完整的产品数量。然后递归部分从列出位置和数量*价格的组合成本的查询中提取排名最高的行,并从种子行中减去可用数量,创建具有剩余产品数量的第二行。然后重复直到没有数量。它有点疯狂,因为可能需要通过使用前几行中的商家列表来避免多次包含同一商家。我认为每次迭代都会有一个排名靠前的商家,这会有所帮助。

对于多个产品,您可能需要从多行(或多个动态列)的“种子”开始,或者分别计算每个产品,然后合并结果。

如果您愿意,也可以使用循环、运行变量和临时表来更有效地完成此过程。

使用公用表表达式的递归查询

于 2012-06-15T05:43:26.107 回答