如何获取SQL中具有MAX和MIN值的行的ID

时间:2011-10-05 15:26:29

标签: mysql sql

我正在尝试使我的网站使用的查询效率更高。

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

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

在我的网站的搜索结果页面中,我希望能够显示:

1)每个产品只有一条记录,即Gibson LP Std的1条记录,然后可以将其链接到不同的结尾。

2)显示的实际产品必须 是最便宜的完成选项,或者是最便宜的库存。

这目前正在我的网站上运行,但它正在使用N + 1查询并且似乎运行得非常慢,但是就我的意思而言,请点击此处:http://www.hartnollguitars.co.uk/search.asp?subcat=Gibson-Les-Pauls(如果血腥的东西有效)

第一部分很好,我可以在SQL中对标题进行分组,这是问题的第2部分。

使用以下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,我目前正在使用经典ASP编写脚本,但我的目标是升级到.NET,一旦我弄清楚如何! : - )

2 个答案:

答案 0 :(得分:0)

我认为对于部分顺序你应该使用像

这样的东西
order by case
    when stock > 0 then 0
    when stock < 0 then 1
    end ascending,
    price ascending

我没有检查语法,但这是个主意。您可以按顺序谷歌案例了解更多信息。

至于你们其他人的要求,我需要表格结构来更好地理解......

答案 1 :(得分:0)

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