尝试为复杂搜索场景构建SQL语句(比较)

时间:2012-04-23 14:43:52

标签: sql database sql-server-2008

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

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

我有一个包含Merchants表和数据库的数据库。 MerchantProducts表和位置表。每个商家都有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&amp; 3.基本上我希望用户输入他们为每种产品提供的产品数量,然后我希望sql通过每个商家,找出哪个商家将为所有这些产品提供最多的全部金额。用户在列表中输入值。

提前致谢,我希望通过我的问题。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

Recursive Queries Using Common Table Expressions