2013-07-18 83 views
0

我有3個表:獲取最接近值的MySQL

價格

id price date 
1  50  20130716 
2  30  20130717 

TVA

id val  start  end 
1  7  20080101 20103112 
2  8  20110101 

MARGIN

id qty marg 
1  500  25 
2  600  20 
3  800  15 
4  1000 13 
5  1250 11 
... 

現在我有這個疑問它沒有按」 t工作:

$quantity = '557'; 

$link->query(" 
     SELECT (
       (price+marg)*((val+100)/100) 
      ) 
     FROM PRICE 
     JOIN TVA 
     JOIN MARGIN 
     WHERE date = '20130717' 
      AND end = '' 
      AND qty = '$quantity' 
"); 

問題是表上沒有qty = '557'。 我想要做的是選擇最接近的數量(在本例中)'557'。

所以,如果:

$quantity = '557'查詢應選擇600

$quantity = '701'查詢應選擇800

$quantity = '1238'查詢應選擇1250

這是可能?

+0

你所有的例子都顯示了「向上」到下一個數量......大概你會想要如果它更接近「向下」圓整? – eggyal

+0

這可能有所幫助:http://stackoverflow.com/questions/1634725/select-closest-numerical-value-with-mysql-query – phil

回答

0
... 
AND `qty` <= $quantity 
ORDER BY `qty` DESC 
LIMIT 1 
0

您可以獲得比您的值更大的值,升序排序並限制爲1個結果。這樣你就可以firt值大於或等於你

SELECT (
       (price+marg)*((val+100)/100) 
      ) 
     FROM PRICE 
     JOIN TVA 
     JOIN MARGIN 
     WHERE date = '20130717' 
      AND end = '' 
      AND qty >= '$quantity' 
ORDER BY qty ASC LIMIT 1 

用同樣的方法,你可以得到價值比你的數量少,看看如果你把它變成一個程序哪一個更接近你的數量

1

,你可以使用類似這樣的東西(排序的僞代碼):

CREATE PROCEDURE pDoStuff(@target INTEGER) 
AS 

    DELCARE @qty INTEGER 

    -- Get closest qty 
    @qty = SELECT TOP 1 qty 
      FROM table 
      ORDER BY ABS(@target - qty) ASC 


    -- use that "actual" qty in your query 
    SELECT ((price+marg)*((val+100)/100) 
    FROM price 
    JOIN TVA 
    JOIN MARGIN 
    WHERE date = 'thedate' 
    AND  end = '' 
    AND  qty = @qty 

GO 

語法不正確,但它給了你一個想法。這將允許您從原始查詢中選擇最接近數量值的所有行。這裏的其他答案大多會限制你的最終結果爲一行(這可能是或者可能不是你真正想要的)。

+0

謝謝!現在的問題是糾正mySQL的語法... :) – Perocat