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选择和分组没有重复的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 php 从 SQL 数据库中选择包含特定文本的所有行 [重复]