【问题标题】:PHP SQL selecting and grouping with no duplicatesPHP SQL选择和分组没有重复
【发布时间】:2021-12-09 03:36:24
【问题描述】:

我不想返回价格最低的重复 ISBN(请参阅粗体行)。我怎样才能做到这一点?

isbn 价格供应商

4000 22.50 公司A

4000 19.99 公司B

4000 22.50 公司C

4001 33.50 公司A

4001 45.50 公司B

4003 11.99 公司B

我的查询旨在使用 OR 运算符。欢迎保留这种方法。

SELECT * FROM table WHERE isbn = 4000 OR isbn = 4001 OR isbn = 4003 GROUP BY isbn ORDER BY price;

【问题讨论】:

  • 由于您特别指出它,值得一提的是,对于这样的查询,IN() 构造通常(几乎总是)比OR 运算符的性能更高。即对于上面的查询WHERE isbn IN(4000,4001,4003) 通常会更好。

标签: php sql select group-by


【解决方案1】:

你只需要使用MIN聚合函数:

SELECT isbn, MIN(price)
FROM table 
WHERE isbn = 4000 OR isbn = 4001 OR isbn = 4003 
GROUP BY isbn 
ORDER BY price;

另外,正如评论所指出的,使用IN 可能比一系列OR 更适合您的情况:

SELECT isbn, MIN(price)
FROM table 
WHERE isbn IN (4000, 4001, 4003)
GROUP BY isbn 
ORDER BY price;

【讨论】:

  • 我将使用一些词,而不仅仅是整数作为 ISBN,所以我很好奇 IN 是否会处理这个问题。无论如何, MIN(price) 在我的查询中似乎失败了。它没有捡起最低的。嗯……
  • IN 适用于任何类型的数据(当然,根据您在列中定义的类型)。如果您的 isbn 列是字符串,则 IN('123', 'ABC', 'XYZ') 也可以正常工作。
  • 我会继续测试。目前看来,MIN 与 IN 相处得并不好。它返回第一行,就好像没有 MIN 一样。没有区别。
  • 这两件事之间应该没有真正的联系。聚合函数在 where 条件之后执行,无论使用 IN 还是一系列 OR,where 条件都应该是等价的。您的表格和数据中是否还有其他未在问题中显示的内容,这可能会导致行为上的一些差异?
  • 是的,我正在构建一些复杂的查询。最好使用 * 而不是所有列。现在我需要使用以下查询来实现 MIN:SELECT name, id, price, isbn, description FROM book_list WHERE isbn IN($in) AND status = 1 AND stock > 0 AND price > 0 GROUP BY isbn ORDER BY price
猜你喜欢
  • 2016-12-06
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 2016-07-18
相关资源
最近更新 更多