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 に答える