Mysql SQL:在子查询中引用列值,反之亦然

Mysql SQL:在子查询中引用列值,反之亦然,mysql,sql,join,subquery,where,Mysql,Sql,Join,Subquery,Where,假设我正在处理一个如下所示的查询: update user as u set u.city = ( select min(c1.id) from ( select c1.id from city c1 where c1.name = ( select c2.name from city c2 where c2.id = u.city)) as d

假设我正在处理一个如下所示的查询:

 update user as u 
   set u.city = (
    select min(c1.id) 
       from (
         select c1.id 
           from city c1 
          where c1.name = (
            select c2.name 
              from city c2 where c2.id = u.city)) as duplicates);
这意味着要删除“我的用户”表中的城市列表,以便在共享相同城市名称的所有id的城市表中具有最小的城市id。因此需要重复数据消除。但是,我得到了这个错误:

ERROR 1054 (42S22): Unknown column 'u.city' in 'where clause'
我的用户表肯定有一个城市列,即

mysql> describe user;
+----------------------------+--------------+------+-----+---------+----------------+
| Field                      | Type         | Null | Key | Default | Extra          |
+----------------------------+--------------+------+-----+---------+----------------+
| id                         | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| first_name                 | varchar(64)  | YES  |     | NULL    |                |
| last_name                  | varchar(64)  | YES  |     | NULL    |                |
...
| city                       | bigint(20)   | YES  | MUL | NULL    |                |
...
+----------------------------+--------------+------+-----+---------+----------------+
36 rows in set (0.00 sec)

<> p>因此,我看到关于这个查询的两个有趣的东西,子查询中提到的用户表城市列值U.City,并且来自城市表的城市ID在中间查询中使用,选择MICC1.ID。我该怎么做

我认为使用显式连接比使用嵌套查询更容易编写这样的查询:

update user u join
       city c
       on u.city = c.city join
       (select name, min(id) as minid
        from city
        group by name
       ) cmin
       on cmin.name = c.name
    set u.city = cmin.minid;
MySQL似乎对嵌套在相关引用上的深度也有限制,尽管我在任何地方都没有发现这个限制。

可能的解决方案:-

UPDATE user 
INNER JOIN
(             
    SELECT u.city, MIN(c1.id) AS min_city
    FROM user u
    INNER JOIN city c2 ON c2.id = u.city
    INNER JOIN city.c1 ON c1.name = c2.name
    GROUP BY u.city
) sub1
ON u.city = sub1.city
SET u.city = sub1.min_city

在编写子查询时,请考虑查询的范围和处理方式。IE:子查询在外部查询之前处理,因此子查询中依赖于外部查询的任何内容都将失败。你必须改变思维,从内到外而不是从外到内写查询。你能按id排序第二个查询并使用LIMIT只返回一行吗?我相信你可以嵌套任意深度,但相关引用的范围仅为一个级别。我相信这就是为什么两次嵌套查询可以绕过MySQL的限制,即不能从同时引用同一个表的查询中更新表。最后,我创建了一个临时表来保存要重复的ID。类似于创建临时表city\u id\u重复数据消除\u映射city\u id bigin20、canonical\u id bigin20、uniquecity\u id;然后从该表中加入/更新。使生活更简单,SQL更易于查看。谢谢你的回答。另外,显然mysql不能很好地比较null,因此等式检查u.city=c.city需要是u.city=c.city,或者u.city为null而c.city为null@MatBailie . . . 我也相信。不幸的是,我找不到最合适的文档参考。