如何获取 SQL 中具有 MAX 和 MIN 值的行的 ID
Posted
技术标签:
【中文标题】如何获取 SQL 中具有 MAX 和 MIN 值的行的 ID【英文标题】:How do I get the ID of a rows which have MAX and MIN values in SQL 【发布时间】:2011-10-05 15:26:29 【问题描述】:我正在努力使我的网站使用的查询更有效率。
对 SQL 有点模糊,我还没有真正学会如何使用嵌套查询,但我只是设法得到了一些非常接近我想要的东西。
我销售吉他,我有一个庞大的数据库,其中包含单独列出的具有不同饰面选项的所有产品。项目在 dB 中具有唯一 ID,但按其标题分组,例如,Gibson Les Paul 标准在我的 dB 中列出 7 次,有 7 个不同的完成选项。并非所有饰面选项都必须具有相同的价格,也并非所有饰面选项都一定有现货。
在我的网站的搜索结果页面中我希望能够显示:
1) 每个产品只有一条记录,即 Gibson LP Std 的一条记录,然后可以将其子链接到不同的饰面。
2) 实际展示的产品必须或者是最便宜的饰面选项,或者是库存中最便宜的。
这目前正在我的网站上运行,但它使用 N+1 查询,并且运行速度似乎非常缓慢,但我的意思的示例,请单击此处:http://www.hartnollguitars.co.uk/search.asp?subcat=Gibson-Les-Pauls(如果该死的东西有效)
第一部分很好,我可以在 SQL 中对标题进行分组,这就是问题所在。
使用以下 SQL 查询,我可以获得最低价格和最高价格,并且我已经计算了有多少变体,我也有最高和最低库存水平。
results.Open "SELECT * FROM
(SELECT *, count(id) as Variants, MAX(price) as highestPrice, MIN(price) as
lowestPrice, MAX(shopstock) as highestStock, MIN(shopstock) as lowestStock FROM
products WHERE item LIKE '%"& replace([searchterm]," ","%") &"%' GROUP BY item)
AS UnknownVar LIMIT 40", conn, 3, &H0001
我需要做的是获取代表最大和最小股票和价格值的行的 ID 值。
我基本上需要能够在其上运行 if/或逻辑,但我不确定这是否可行。
所以,我需要能够说
if Item_With_Cheapest_Price is in stock, display this as the thumbnail & link
else
display first item in price sorted list where stock >=1
我还需要备用,如果没有库存,请展示最便宜的。
数据库是使用 ODBC 连接的 mysql,我目前正在使用 Classic ASP 编写脚本,但目标是升级到 .NET,一旦我弄清楚如何使用!!! :-)
【问题讨论】:
想一想,item表有多少条记录? stivlo;总共有几千种产品,但项目的分组价值(即 Gibson Les Paul Standard)应该有不超过 20 个完成选项。 我怀疑这一点。与您的问题无关,但速度缓慢的一个原因是查询的这一部分 WHERE item LIKE '%"& replace([searchterm]," ","%" - 因为 % 符号位于术语索引的前面'不被使用,MySQL 将不得不检查每一行。看看full text search 感谢 Stivlo,我已经看过了,但现在我无法通过多词查询获得合理的结果,例如,搜索 Gibson LEs Paul 只会生成所有 Gibson 条目。使用 WHERE MATCH (item) AGAINST ('"&[searchterm]&"' IN BOOLEAN MODE) 获得最高价格的要求从何而来? 【参考方案1】:我认为对于按部分排序,您应该使用类似
order by case
when stock > 0 then 0
when stock < 0 then 1
end ascending,
price ascending
我没有检查语法,但这就是想法。您可以按顺序搜索案例以获取更多信息。
至于你们其他人的要求,我需要表格结构才能更好地理解......
【讨论】:
啊,这可以帮助简化事情。我明天去看看,现在得跑了。使用 GROUP_CONCAT 获得了相当不错的结果,它似乎在组内生成了一组项目。这很有用,如果按案例排序可以让我以正确的顺序获取这些数组,它将节省对数组的排序,并且可以准确地给我我需要的东西......虽然直到下周才能回到这个现在! :-(【参考方案2】:你知道dense_rank的概念吗?如果不是,我可以向你解释。您的目的可以通过以下查询来解决。看看这个。
SELECT id,
MIN(stock) KEEP (DENSE_RANK FIRST ORDER BY stock,price) "Lowest"
,MAX(stock) KEEP (DENSE_RANK LAST ORDER BY stock,price) "Highest"
FROM products
GROUP BY id;
【讨论】:
嗨,这看起来很有趣,你能详细说明它的实际作用吗? 嗨,你能用坚果壳给出你的要求吗..即你想要什么,然后我就可以给你确切的查询 试试这个download.oracle.com/docs/cd/B19306_01/server.102/b14200/… 看起来很有趣。令人恼火的是,我的注意力现在已经从这个问题转移到其他事情上,但我肯定会回到这个问题上。感谢所有帮助:)以上是关于如何获取 SQL 中具有 MAX 和 MIN 值的行的 ID的主要内容,如果未能解决你的问题,请参考以下文章