2012-10-21 65 views
2

有沒有人有任何想法我可以繞過#1235 - 這個版本的MySQL還不支持'LIMIT & IN/ALL/ANY/SOME subquery'錯誤?不在mysql子查詢限制

我的查詢是下面(我讀過,我可以升級MySQL,但,這是不可能的):

$query = @mysql_query("SELECT * FROM posts 
         WHERE postid NOT IN 
         (SELECT postid FROM log 
         ORDER BY posted DESC 
         LIMIT 10) 
         ORDER BY (RAND() * Multiplier) 
         LIMIT 1"); 

回答

7

根據這一bug,你可以使用這個醜陋的解決方法:

SELECT * FROM t1 WHERE s1 NOT IN 
(SELECT * FROM (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1) AS alias) 
+0

令人驚歎 - 非常感謝。 – Haribo83

2

可以使用JOIN重寫查詢:

SELECT * 
FROM  posts NATURAL LEFT JOIN (
    SELECT postid FROM log ORDER BY posted DESC LIMIT 10 
) t 
WHERE t.postid IS NULL 
ORDER BY RAND() 
LIMIT 1 

然而,請注意,ORDER BY RAND()非常昂貴的。不僅必須爲每條記錄計算隨機值,還必須對結果進行排序。索引是沒有用的。

你會過得更好,如果你有一列包含唯一整數col,然後與col索引可以非常迅速地獲得與隨機記錄:

SELECT * 
FROM  posts NATURAL LEFT JOIN (
    SELECT postid FROM log ORDER BY posted DESC LIMIT 10 
) t JOIN (
    SELECT RAND() * MAX(col) AS rand FROM posts 
) r ON posts.col >= r.rand 
WHERE  t.postid IS NULL 
LIMIT  1 

注意,這種「隨機性」的一致性將取決於col內的任何其他過濾發生後的整數​​分佈。