MySQLi:提前查询以限制价格范围内的产品数量

时间:2015-06-08 11:29:39

标签: mysql sql mysqli

是否可以在MySQLi查询参数中设置以下内容:

例如:我有一个产品表,其中包含各种价格不同的产品

表:产品

id  name     price
1   pen      10
2   banana   50
3   potato   10
5   apple    20
6   guaba    30
7   papa     30
8   salt     80
9   butter   25
10  cheese   10  

我想在MySQLi声明中限制价格范围和产品范围 例如:当我想显示5个产品时,这些价格累计到100或接近100,它将从数据库中获取任何5个产品,其价格累计为100个。

同样,当我想要显示2个产品时,这些价格会累积到100或接近100,它将获取那些价格匹配的任何两个产品累计100或接近100。

我了解到可以通过以下方式制定价格范围;但我不确定我是否也可以限制这些价格范围的产品编号。

价格范围;我可以做:

SELECT id, name, price
FROM (
   SELECT id, name, price,
          @cumSum:= @cumSum + price AS cumSum
   FROM products, (SELECT @cumSum:=0) var
   ORDER BY id ) t
WHERE cumSum <= 100  

但我怎样才能限制价格范围内的产品数量?

1 个答案:

答案 0 :(得分:2)

我想你想找到5个价格,它们的总和最接近100:

SQL Fiddle

SELECT *
FROM t
WHERE (
SELECT 
    CONCAT('|', t1.id, '|', t2.id, '|', t3.id, '|', t4.id, '|', t5.id, '|')
FROM 
    t t1
    JOIN
    t t2 ON t1.id <> t2.id
    JOIN
    t t3 ON t1.id <> t3.id AND t2.id <> t3.id
    JOIN
    t t4 ON t1.id <> t4.id AND t2.id <> t4.id AND t3.id <> t4.id
    JOIN
    t t5 ON t1.id <> t5.id AND t2.id <> t5.id AND t3.id <> t5.id AND t4.id <> t5.id
ORDER BY
    ABS(t1.price + t2.price + t3.price + t4.price + t5.price - 100)
LIMIT 1) LIKE CONCAT('%|', id ,'|%');

结果是:

id  name    price
1   pen     10
2   banana  50
3   potato  10
5   apple   20
10  cheese  10

以及2个价格:

SELECT *
FROM t
WHERE (
SELECT 
    CONCAT('|', t1.id, '|', t2.id, '|')
FROM 
    t t1
    JOIN
    t t2 ON t1.id <> t2.id
ORDER BY
    ABS(t1.price + t2.price - 100)
LIMIT 1) LIKE CONCAT('%|', id ,'|%');