2012-04-23 54 views
1

我想爲複雜的搜索場景構建SQL語句,我需要你們幫助。情景是:試圖爲複雜的搜索場景構建SQL語句(比較)

我試圖提供一項服務,商家將爲其註冊並提供他們將爲每個產品提供的最佳價值(最多的錢),然後用戶可以提供他們的位置並提供多少/他們每個產品有多少公斤,並將其值輸入到輸入表單中,然後我希望我的SQL將所有商家列入他們將在TOTAL中提供的金額,其中最多的商品將從頂部開始。

我有一個數據庫與招商局表& 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 

我想創建一個存儲過程來完成no。 1,2 & 3.基本上我希望用戶輸入他們每種產品有多少公斤的產品,然後我想讓sql通過每個商家並找出哪個商家將爲所有商品提供最多的總金額那些用戶在列表中輸入的產品。

在此先感謝,我希望我能通過我的問題。

+2

你的問題是什麼? – 2012-04-23 14:49:04

+0

對不起,我正在嘗試創建一個存儲過程來完成no。 1,2&3。基本上我想要用戶輸入他們每種產品有多少公斤的產品,然後我想讓sql通過每個商家,並找出哪個商家會給列表中最多的錢。 – kurban294 2012-04-23 17:43:53

+0

感謝您告訴我們您正在嘗試做什麼,但您需要提出具體問題。本網站不適合志願爲您工作的人員。你寫的是一個規範,而不是一個問題。 – JohnFx 2012-04-23 18:33:09

回答

0

我相信你所描述的是一個優化問題,你「根據位置和價格填寫訂單」。我想你可能想爲每個距離分配一個「運輸成本」,否則你可能無法同時優化最佳價格和最佳位置。

對於單個產品,您可能可以使用遞歸查詢來優雅地解決此問題,該查詢可以使用SQL Server中的公用表表達式進行編寫。 CTE內的第一個種子行將是用戶的位置和完整的產品數量。然後,遞歸部分從列出位置和數量*價格的組合成本的查詢中拉出排名靠前的行,並從種子行中減去可用數量,從而創建第二行與剩餘產品數量。然後重複,直到沒有數量。它的一種狂野,因爲可能需要避免使用前一行中的商戶列表多次包含同一商家。我認爲每次迭代都會有一位頂級的商家,這對我們有所幫助。

對於多個產品,您可能需要以多行(或多個動態列)的「種子」開始,或分別計算每個產品,然後合併結果。

也許這個過程也可以在功能上多使用循環,運行的變量,如果你願意來完成,而臨時表。

Recursive Queries Using Common Table Expressions