【发布时间】: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)
-
获得最高价格的要求从何而来?