好的,我有这个查询,它给了我DISTINCT product_series,以及表中的所有其他字段:
SELECT pi.*
FROM (
SELECT DISTINCT product_series
FROM cart_product
) pd
JOIN cart_product pi
ON pi.product_id =
(
SELECT product_id
FROM cart_product po
WHERE product_brand = "everlon"
AND product_type = "'.$type.'"
AND product_available = "yes"
AND product_price_contact = "no"
AND product_series != ""
AND po.product_series = pd.product_series
ORDER BY product_price
LIMIT 1
) ORDER BY product_price
这很好用。我也按价格订购,所以我可以得到每个系列的起始价格。好的。
然而今天我的老板告诉我,从这个查询中显示的所有产品都是metal_type
白金并且他想要显示随机金属类型。所以我在ORDER BY价格后面的订单中添加了RAND(),这样我仍然会得到最低的价格,但是价格最低的随机金属..这里是新的查询:
SELECT pi.*
FROM (
SELECT DISTINCT product_series
FROM cart_product
) pd
JOIN cart_product pi
ON pi.product_id =
(
SELECT product_id
FROM cart_product po
WHERE product_brand = "everlon"
AND product_type = "'.$type.'"
AND product_available = "yes"
AND product_price_contact = "no"
AND product_series != ""
AND po.product_series = pd.product_series
ORDER BY product_price, RAND()
LIMIT 1
) ORDER BY product_price, RAND()
当我运行此查询时,MySQL完全关闭并告诉我连接太多我接到主机管理员打来的电话,问我到底做了什么。
我不相信可能只是从查询中添加了RAND(),我认为这必须是巧合。一切都修好后我等了几个小时再次运行查询。马上......同样的问题。
那是怎么回事?因为我不知道。我的查询有问题吗?
感谢!!!!
答案 0 :(得分:1)
这是一篇博文,很好地解释了这个问题,并提供了解决方法:
http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/
这是针对MySQL ORDER BY RAND()
的类似警告,我认为其原因基本相同:
答案 1 :(得分:1)
对ORDER BY
使用RAND()不是一个好主意,因为它不会随着数据的增加而扩展。您可以在我对this question的回答中看到有关它的更多信息,包括您可以调整的两个备选方案。
答案 2 :(得分:0)
根据您网站中的产品数量,该功能调用将在每条记录中执行一次,这可能会大大降低查询速度..
Too Many Connections错误可能是由于此查询在尝试计算这些数字时阻止其他人。
找另一种方式。 ;)
答案 3 :(得分:0)
相反,您可以使用您正在使用的编程语言而不是MySQL端生成随机数,因为每行都会调用rand()
答案 4 :(得分:0)
如果您知道有多少记录,可以选择这样的随机记录(这是Perl):
$handle->Sql("SELECT COUNT(0) AS nor FROM table");
$handle->FetchRow();
$nor = $handle->Data('nor');
$rand = int(rand()*$nor)+1;
$handle->Sql("SELECT * FROM table LIMIT $rand,1");
$handle->FetchRow();
.
.
.