3

わかりました。今日は一日中頭を悩ませましたが、これを機能させることができません。基本的に、アクティブなログインユーザーがまだ投票していないすべての写真を含む一時テーブルからランダムに12枚の写真をクエリしようとしています。

エラーは明らかに#1137です-テーブルを再度開くことはできません:'r1'この一時テーブルは1回しか参照できません。

    CREATE TEMPORARY TABLE unvoted_photos
    SELECT *
    FROM photo
    WHERE photo.photo_uid 
    NOT IN 
    ( SELECT photo_uid
    FROM vote
    WHERE vote.user_uid = '12345' ) ;

    SELECT photo_uid, caption, storage_path
      FROM unvoted_photos AS r1 
      JOIN (SELECT (RAND() * 
                    (SELECT MAX(id)
                    FROM unvoted_photos)) AS sid)
                    AS r2
     WHERE r1.id >= r2.id
     ORDER BY r1.id ASC
     LIMIT 12;

パフォーマンスの問題により、ランダム選択クエリはこの例に従いました。そうでなければ、これは確かに機能します。

    SELECT ... FROM photo WHERE photo_uid NOT IN ( voted images subquery ) ORDER BY RAND() LIMIT 12 
4

1 に答える 1

0

質問に関する議論に対応して、すぐに実行できるはずの2つをマージする方法を次に示します。これをJOINsで書き直しますが、この場合、一時テーブルをサブクエリにドロップして、何が起こったかを確認できるようにしました。

SELECT photo_uid, caption, storage_path
  FROM (
          SELECT photo_uid, caption, storage_path
          FROM photo
          WHERE photo.photo_uid 
          NOT IN 
          ( 
            SELECT photo_uid
            FROM vote
            WHERE vote.user_uid = '12345' 
          )

       ) r1 
  JOIN (SELECT (RAND() * 
                (SELECT MAX(id)
                FROM unvoted_photos)) AS sid)
                AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 12;
于 2013-02-07T14:58:41.433 に答える