【发布时间】:2019-10-31 16:49:28
【问题描述】:
我有下一个查询问题和下一个更新问题: 我的主要用户表如下(我只显示重要字段):
+----------------------+
|id|name |collective_id|
+----------------------+
|1 |dark |NULL |
+----------------------+
|2 |thor |NULL |
+----------------------+
|3 |vinky|NULL |
+----------------------+
以及以users.id(FK为contrats.user_id)命名的contracts与users相关的外部表:
-------------------------------------------------
|id|user_id|ts_from|ts_expire|type|collective_id|
-------------------------------------------------
|1 |1 |1000000|2000000 |1 |NULL |
|2 |1 |1000001|2000001 |1 |NULL |
|3 |1 |1000001|2000001 |3 |15 |
|4 |1 |1000002|2000002 |3 |8 |
|5 |2 |1000000|2200000 |2 |NULL |
我要的查询结果是下一个:
-----------------------
|user_id|collective_id|
-----------------------
|1 |8 |
|2 |NULL |
|3 |NULL |
结果是两个表的联合,与字段 contracts.user_id=users.id 和 LEFT JOIN 相关,但注意 collective_id 是 ts_expire 字段在 contracts 表中的最新字段并且具有 @ 987654329@,这就是为什么为user_id1 选择的collective_id 是8,而不是15 并且其他用户不包含任何collective_id,因为他们与@ 没有任何合同987654336@。你明白吗?
与此问题相关的最后一个问题是我的 users 表也包含一个 collective_id 字段,应该使用此值进行更新,UPDATE 查询应该如何基于此条件更新 users.collective_id 字段?
非常感谢
Daniel 来自巴塞罗那(php 编程专家,不熟悉 mysql 复杂查询)
我已经测试了几个查询,但没有成功:
UPDATE `users`
SET `collective_id` = (
SELECT `collective_id`
FROM `contrats`
WHERE
`vigency` = 1
AND `type` = 3
AND `user_id` = 1
ORDER BY `ts_expire` DESC
LIMIT 1
)
WHERE `users`.`id`=1;
这有效,但仅适用于指定的一个用户,而不是整个用户表。
UPDATE `users` u, contracts
LEFT JOIN (
SELECT `user_id`, `collective_id`
FROM `contratos`
WHERE
`users_id`= u.`id`
AND `vigency`= 1
AND `type` = 3
) contracts ON contracts.`user_id`=u.`id`
SET `collective_id` = contracts.`collective_id`
WHERE 1;
通过使用相同的值更新整个 users.collective_id,这会出错。
【问题讨论】:
标签: mysql sql sql-update