我有3张桌子:
PRICE
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
...
现在我的查询不起作用:
$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 :(得分: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
语法不正确,但它会给你一个想法。这将允许您从原始查询中选择具有最接近数量值的所有行。这里的大多数其他答案都会将您的最终结果限制在一行(这可能是您实际想要的,也可能不是。)
答案 1 :(得分:0)
...
AND `qty` <= $quantity
ORDER BY `qty` DESC
LIMIT 1
答案 2 :(得分: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
使用相同的方法,您可以获得低于您的数字的价值,并查看哪一个更接近您的数量