不在mysql子查询限制中

时间:2012-10-21 09:47:50

标签: php mysql subquery

有没有人知道如何绕过#1235 - 这个版本的MySQL还不支持'LIMIT & IN/ALL/ANY/SOME subquery'错误?

我的查询如下(我读过我可以升级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");

2 个答案:

答案 0 :(得分:7)

根据这个bug,你可以使用这个丑陋的解决方法:

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

答案 1 :(得分: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内整数的分布。