2

有没有人知道我该如何解决#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");
4

2 回答 2

7

根据这个错误,您可以使用这个丑陋的解决方法:

SELECT * FROM t1 WHERE s1 NOT IN 
(SELECT * FROM (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1) AS alias)
于 2012-10-21T09:53:01.150 回答
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任何其他过滤发生后整数的分布。

于 2012-10-21T10:04:31.677 回答