是否可以在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
但我怎样才能限制价格范围内的产品数量?
答案 0 :(得分:2)
我想你想找到5个价格,它们的总和最接近100:
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 ,'|%');