有没有人知道如何绕过#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");
答案 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
内整数的分布。