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 . . . 我也相信。不幸的是,我找不到最合适的文档参考。