0

我有 3 张桌子:

价格

id   price   date
1     50     20130716
2     30     20130717

电视广告

id    val      start      end
1      7     20080101   20103112
2      8     20110101

利润

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

现在我有这个不起作用的查询:

$quantity = '557';

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

问题是桌子上没有a qty = '557'。我想做的是选择最接近(在这种情况下)'557'的数量。

因此,如果:

$quantity = '557'查询应该选择600

$quantity = '701'查询应该选择800

$quantity = '1238'查询应该选择1250

等等

这可能吗?

4

3 回答 3

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

语法不正确,但它给了你一个想法。这将允许您从原始查询中选择具有最接近数量值的所有行。这里的大多数其他答案会将您的最终结果限制为一行(这可能是您实际想要的,也可能不是您真正想要的)。

于 2013-07-18T15:15:02.963 回答
0
...
AND `qty` <= $quantity
ORDER BY `qty` DESC
LIMIT 1
于 2013-07-18T15:08:46.140 回答
0

您可以获得比您更大的价值,按升序排列并限制为 1 个结果。所以你可以设置更大或等于你的值

  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

使用相同的方法,您可以获得低于您的数字的价值,并查看哪个更接近您的数量

于 2013-07-18T15:08:49.723 回答