如何获得SQL中有最大值和最小值的行的ID

问题描述:

我正在尝试使查询使我的网站使用效率更高。如何获得SQL中有最大值和最小值的行的ID

由于对SQL有点模糊,我还没有真正学会如何使用嵌套查询,但我设法得到了一些非常接近我想要的东西。

我出售吉他,我有一个大的数据库,所有产品的不同完成选项单独列出。项目在dB中具有唯一的ID,但是按其标题分组,例如,Gibson Les Paul Standard以7次不同的完成选项以dB 7次列出。并非所有的完成选项都必须具有相同的价格,并非所有的完成选项都必须有库存。

在我的网站的搜索结果页面我希望能够表现出:

1)只要一条按产品记录,即1记录吉布森LP标准,然后可以子链接到不同饰面。

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 Item_With_Cheapest_Price is in stock, display this as the thumbnail & link 
else 
display first item in price sorted list where stock >=1 

我还需要一个回落,如果没有完成的有库存,显示最便宜的。

该数据库是MySQL使用ODBC连接,我目前在经典ASP脚本,但目标是升级到.NET,一旦我已经了解如何! :-)

+0

有一个想法,项目表中有多少条记录? – stivlo

+0

stivlo;总共有几千种产品,但是项目的分组价值(即吉布森莱斯保罗标准)应该有不超过20个完成选项。 –

+0

我一直在怀疑。无关你的问题,但对于缓慢的一个原因是查询的WHERE项目LIKE“%‘&替换([搜索关键词]’,”,‘%’的这一部分 - 因为%符号是在长期指标面前能不会被使用,MySQL将不得不检查**每一行**。看看[全文搜索](http://dev.mysql.com/doc/refman/5.0/en/fulltext-search。 HTML) – stivlo

我认为对于ORDER BY部分,你应该使用类似

order by case 
    when stock > 0 then 0 
    when stock < 0 then 1 
    end ascending, 
    price ascending 

我没有检查语法,但是这是想法。您可以按顺序通过Google案例了解更多信息。

至于你要求的休息,我需要的表结构,以更好地了解...

+0

啊,那将有助于简化事情的信息。我明天会看看,现在就跑。使用GROUP_CONCAT可以获得相当不错的结果,这似乎可以在组内生成一系列项目。这很有用,如果按顺序排序可以让我按照正确的顺序获得这些数组,它可以节省排序数组,并且可以准确地给我所需要的数据...尽管如此,现在还是不能回到下周! :-( –

你知道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; 
+0

嗨,这看起来很有趣,你可以详细阐述其实际作用? –

+0

喜U可以给乌尔在果壳你想的话,我将b能够连锁行业üXACT查询 – pravs

+0

试试这个..iewat做要求的HTTP ://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions056.htm – pravs