【问题标题】:MySQLi: Advance query to limit the number of products for the price rangeMySQLi:高级查询以限制价格范围内的产品数量
【发布时间】:2015-06-08 11:29:38
【问题描述】:

是否可以在 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 的产品时,它将从数据库中获取价格累积到 100 的任何 5 个产品。

再次,当我想显示 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  

但是如何限制价格范围内的产品数量?

【问题讨论】:

  • 您想要任何五种产品还是按 id 排序?
  • 产品的价格是否可能高于查询参数?在这种情况下:cumSum 在您的查询中。
  • order by 可以是任何东西,id 或 price。只需要产品限制的逻辑,升序或降序都没有问题。只需要指定产品数量和累计价格范围
  • 如果用户需要展示5个累计价格40或接近40的产品怎么办?因为你没有价格低于 10 的产品?
  • sql 和 php 两者。实际上,我不知道使用 sql 来解决这个问题。但是,php 会,有很多代码。我将此标记为收藏,如果我有线索会回来的。因为我也需要这个..

标签: mysql sql


【解决方案1】:

我想你想找到 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 ,'|%');

【讨论】:

  • 这是一个很好的解决方案。但是如何在不重写查询的情况下制定另一个价格?我的意思是用它作为变量。这是 2 或 5 的价格,如果是 3,4 等呢?
  • 是的,你的回答很好;但我的查询需要是动态的。产品限制和价格范围的数量将随着变量的变化而变化,例如 5 和 2。这两个条件的事情将如下所示: $number_product="5"; $price_range="100";例如,它会有所不同
  • @ZahirulHaque 我想,你可以用这个。并对 php 做一些改进,使查询动态化。
  • 嗨,无论如何,它都是不错的代码;但是当我以 4 或 5 个价格运行代码时,它变得非常慢。有没有什么优化的方法让它变快?
  • 我的查询优化不太好,建议你再问一个关于查询性能的问题;)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
相关资源
最近更新 更多