【问题标题】:Trying to build an SQL statement for complex search scenario (Comparison)尝试为复杂的搜索场景构建 SQL 语句(比较)
【发布时间】:2012-04-23 14:43:52
【问题描述】:

我正在尝试为复杂的搜索场景构建 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 遍历每个商家并找出哪个商家将为所有人提供最多的总金额用户在列表中输入值的那些产品。

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

【问题讨论】:

  • 对不起,我正在尝试创建一个存储过程来完成否。 1,2 & 3. 基本上我希望用户输入他们对每种产品有多少公斤的产品,然后我希望 sql 遍历每个商家并找出哪个商家会在列表中给出最多的钱。
  • 感谢您告诉我们您要做什么,但您需要提出一个具体问题。本网站不适合自愿为您工作的人。你写的是一个规范,而不是一个问题。
  • 感谢您的回复 JohnFx,是的,我明白了,我真的不希望有人为我做我的工作,我只需要正确方向的帮助,或者如果教程有类似问题,那么我很高兴从那里拿走它。我对sql不太熟悉,任何建议都会很棒。谢谢

标签: sql database sql-server-2008


【解决方案1】:

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

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

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

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

Recursive Queries Using Common Table Expressions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多