MySQL:如何解决此查询的临时表错误?

Posted

技术标签:

【中文标题】MySQL:如何解决此查询的临时表错误?【英文标题】:MySQL: How to get around temporary table error on this query? 【发布时间】:2013-01-23 01:23:13 【问题描述】:

好吧,我今天一整天都在琢磨这个问题,无法让它工作,基本上我试图从一个临时表中随机查询 12 张照片,其中包含所有活跃的登录用户尚未投票的照片开。

错误很明显是#1137 - Can't reboot table: 'r1' which temp table can only be reference once.

    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;

由于性能问题,随机选择查询遵循此example。否则这肯定会奏效。

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

【问题讨论】:

hm,我可以建议使用SELECT ... FROM photo WHERE photo_uid NOT IN ( voted images subquery ) ORDER BY RAND() LIMIT 12 吗?应该做的伎俩,即使没有临时表 @Najzero 。 . .您应该将其发布为解决方案。 @Najzero 当然可以,但我有点需要随机选择查询部分来解决性能问题。您可以点击此链接并查看底部的“性能”比较:jan.kneschke.de/projects/mysql/order-by-rand @jerrytouille 嗯,是的,也考虑了性能,但无法计算出创建临时文件的速度要快得多(我无法访问您发布的公司防火墙链接)。看看这里:***.com/questions/1244555/… 接受的答案看起来很可靠 @Najzero 不错的链接,但它与我的 OP 中的“示例”超链接大致相同。我的问题是 unvoted_photos 表引用,它是从顶部创建的临时表。有没有办法将这两个部分结合起来,所以我不需要临时 unvoted_photos 表? 【参考方案1】:

根据对问题的讨论,这是一种将两者合并在一起的方法,您应该可以立即运行。我会用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;

【讨论】:

以上是关于MySQL:如何解决此查询的临时表错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决postgresql中的“无法写入临时文件块:设备上没有剩余空间”?

mysql数据库怎么把查询出来的数据生成临时表

MySQL查询表内容一直保持查询状态

如何解决 MySQL 错误“您不能在 FROM 子句中指定目标表 X 进行更新”? [复制]

如何重写此 MySQL 查询,使其不会引发此错误:您无法在 FROM 子句中指定目标表 'crawlLog' 进行更新?

MySQL 存储过程,获取使用游标查询的结果集