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