提问者:小点点

MySQL-子查询问题-无法重用表


WITH t as (
SELECT *
            FROM scd p
            WHERE  p.modified_date > FROM_UNIXTIME(1593060230)
                AND ( p.main_id = 1
                OR FIND_IN_SET(1, p.mult_ids) <> 0 )
            ORDER BY modified_date DESC
            LIMIT 2 OFFSET 0
),
del as (
SELECT 
* 
FROM t WHERE (status <> 1 AND status <> 2)
),
w_del as (
SELECT 
* 
FROM t WHERE (status = 1 OR status = 2)
)
SELECT w_del.*, del.* FROM w_del,del;

我如何用普通的子查询来实现这一点。 我使用的是MySQL5.7,不能使用CTE。 如果我使用联合/子查询,Im获取不能重用表错误。 有没有一种方法可以在没有临时桌子的情况下实现这一点?

请帮帮我。


共1个答案

匿名用户

您可以插入每个别名的代码。 。。。一直这样做,直到你站在基台:

SELECT w_del.*, del.*
FROM (SELECT t.*
      FROM (SELECT *
            FROM scd p
            WHERE p.modified_date > FROM_UNIXTIME(1593060230) AND
                  ( p.main_id = 1 OR FIND_IN_SET(1, p.mult_ids) <> 0 )
            ORDER BY modified_date DESC
            LIMIT 2 OFFSET 0
           ) t
       WHERE (status <> 1 AND status <> 2)
      ) w_del CROSS JOIN
     (SELECT t.*
      FROM (SELECT *
            FROM scd p
            WHERE p.modified_date > FROM_UNIXTIME(1593060230) AND
                  ( p.main_id = 1 OR FIND_IN_SET(1, p.mult_ids) <> 0 )
            ORDER BY modified_date DESC
            LIMIT 2 OFFSET 0
           ) t
       WHERE (status = 1 OR status = 2)
      ) del;

不过,有一个关键点:T的定义使用了order bylimit。 如果modified_date列中存在关系,那么两个子查询可能返回不同的结果集。 您有两个选择来避免这里的问题:

  1. Order by添加额外的键,以确保排序是稳定的(即每次返回相同的结果,因为键的组合是唯一的)。
  2. 使用临时表实现子查询。