我正在尝试使我的网站使用的查询效率更高。
对于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,一旦我弄清楚如何! : - )
答案 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;