【问题标题】:MYSQL - Subqueries problem - Cant reuse the tableMYSQL - 子查询问题 - 不能重用表
【发布时间】:2020-07-04 12:19:53
【问题描述】:
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;

我如何通过普通的子查询来实现这一点。我正在使用 MySQL 5.7 并且不能使用 CTE。如果我使用 UNION/子查询,我将无法重用表错误。有没有办法在没有临时表的情况下实现这一点?

请帮忙。

【问题讨论】:

    标签: mysql sql mysql-5.7


    【解决方案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. 使用临时表实现子查询。

    【讨论】:

    • 我的开发环境是 8.0,产品是 5.7。我在开发中尝试了同样的方法,但它不起作用。所以在这里发布了这个问题。你知道为什么它在 8.0 中不起作用吗??
    • @user1720827 。 . . “不工作”是什么意思?这很模糊。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2021-07-10
    相关资源
    最近更新 更多