PHP SQL选择和分组没有重复

Posted

技术标签:

【中文标题】PHP SQL选择和分组没有重复【英文标题】:PHP SQL selecting and grouping with no duplicates 【发布时间】: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) 通常会更好。 【参考方案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

以上是关于PHP SQL选择和分组没有重复的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL 单行中选择并设置为 php 数组 [重复]

如何使用 php 从 SQL 数据库中选择包含特定文本的所有行 [重复]

sql中根据表中一个字段分组分别统计每个分组的记录数

如何优化 sql 查询以避免在没有 php.ini 或设置时间限制的情况下执行最长时间 [关闭]

PHP网站没有正确更新记录[重复]

分组选择器