【发布时间】:2014-05-11 10:15:52
【问题描述】:
假设我正在处理一个看起来像这样的查询:
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)
所以我看到关于这个查询的两个有趣的事情,用户表城市列值(u.city)在子查询中被引用,城市表中的城市id被用于中间查询,(select min( c1.id))。我该如何进行这项工作?
【问题讨论】:
-
在编写子查询时,请考虑范围以及如何处理查询。 IE:子查询在外部查询之前处理,因此子查询中依赖于外部查询的任何内容都将失败。你必须转变你的想法,从里到外写查询,而不是从外到里。
-
你可以按 id 排序第二个查询并使用 LIMIT 只返回一行
标签: mysql sql join subquery where