Mysql 复杂更新查询

Mysql 复杂更新查询,mysql,sql,Mysql,Sql,表1 表2 我正试图用第二张表中蓝色汽车的汽车id更新Alex的汽车id。可以在一个查询中完成吗 我尝试在下面编写查询,但无法使其工作。有什么想法吗 UPDATE table1 SET table1.car_id = table2.car_id FROM table1 JOIN table2 ON table2.color = "blue" WHERE table1.name = "Alex" 预期结果: 我怀疑它在一个查询中不起作用。[编辑:错误,请参阅其他答案]

表1

表2

我正试图用第二张表中蓝色汽车的汽车id更新Alex的汽车id。可以在一个查询中完成吗

我尝试在下面编写查询,但无法使其工作。有什么想法吗

UPDATE table1
   SET table1.car_id = table2.car_id
  FROM table1
  JOIN table2 
    ON table2.color = "blue"
 WHERE table1.name = "Alex"
预期结果:


我怀疑它在一个查询中不起作用。[编辑:错误,请参阅其他答案]

对于没有公共列的两个不同表,您有两种不同的要求。 您需要独立于Alexes row查找蓝色汽车id,因为它们现在没有任何链接

我会这样做:

UPDATE table1 SET table.car_id = ( SELECT car_id FROM table2 WHERE color LIKE 'blue' ) WHERE name LIKE 'Alex'
更新secondTable上的firstTable join secondTable.color='blue'设置firstTable.car\u id=secondTable.car\u id,其中firstTable.car\u id为空

我有一个类似问题的解决方案,就是人多车多。 也许会有帮助

基本数据选项卡如下所示

CREATE TABLE Table1
(`id` int, `name` varchar(4), `address` varchar(7), `car_id` varchar(4))
;

INSERT INTO Table1
(`id`, `name`, `address`, `car_id`)
VALUES
(1, 'Alex', 'US', NULL),
(2, 'Jaso', 'Canad a', '1'),
(3, 'Paso', 'Canad a', NULL),
(4, 'Paso', 'danad a', NULL)
;


CREATE TABLE Table2
(`car_id` int, `color` varchar(7))
;

INSERT INTO Table2
(`car_id`, `color`)
VALUES
(1, 'red'),
(2, 'blue'),
(3, 'green') ,
(4, 'purple')
;
mysql 5.7之前的sql语句

Update Table1 t1a inner Join
(Select tab1.id, tab2.car_id From
( Select 
   `id`,
   @curRank := @curRank + 1 AS rank
  FROM Table1, (SELECT @curRank := 0) r
  WHERE car_id IS NULL ) tab1 
inner join
( Select 
    car_id,
    @curRank2 := @curRank2 + 1 AS rank
  From Table2 , (SELECT @curRank2 := 0) r Where car_id NOT IN 
   (
    Select Car_id From
      (Select GROUP_CONCAT(t1.car_id) car_id FROM Table1 as t1) t1e 
       WHERE car_id IS NOT NULL GROUP BY car_id

      ) 
  ) tab2 
  ON   tab1.rank = tab2.rank) t2a
on t1a.id = t2a.id
SET t1a.car_id = t2a.car_ID
;
我们在这里面临的问题是,实际上我们需要表taht中的车辆ID已经被取下。然后仅选择尚未选择的车辆id的其余部分。 之后,我们必须作出声明,使任何人都能得到一种颜色,即每种颜色只被选择一次。这需要一些代码,因为我们在tabel1 car_id thta为NULL和table2之间没有关系

所以结果是

id  name    address     car_id
 1  Alex    US          2
 2  Jaso    Canad a     1
 3  Paso    Canad a     3
 4  Paso    danad a     4

mysql 8使用的是窗口功能,而不是车辆等级。

我怀疑你错了,是的。但是oneliner解决方案比Nessery更复杂,没有性能优势。在t2.color='blue'集合t1.car\u id=t2.car\u id上更新t1 JOIN t2,其中t1.car\u id为NULL;是的,草莓的解决方案奏效了!非常感谢。你应该把它作为答案贴出来,这样我就可以选择它作为答案了!太琐碎了,您的查询似乎适合sql server-mysql语法与读取多表语法不同:
CREATE TABLE Table1
(`id` int, `name` varchar(4), `address` varchar(7), `car_id` varchar(4))
;

INSERT INTO Table1
(`id`, `name`, `address`, `car_id`)
VALUES
(1, 'Alex', 'US', NULL),
(2, 'Jaso', 'Canad a', '1'),
(3, 'Paso', 'Canad a', NULL),
(4, 'Paso', 'danad a', NULL)
;


CREATE TABLE Table2
(`car_id` int, `color` varchar(7))
;

INSERT INTO Table2
(`car_id`, `color`)
VALUES
(1, 'red'),
(2, 'blue'),
(3, 'green') ,
(4, 'purple')
;
Update Table1 t1a inner Join
(Select tab1.id, tab2.car_id From
( Select 
   `id`,
   @curRank := @curRank + 1 AS rank
  FROM Table1, (SELECT @curRank := 0) r
  WHERE car_id IS NULL ) tab1 
inner join
( Select 
    car_id,
    @curRank2 := @curRank2 + 1 AS rank
  From Table2 , (SELECT @curRank2 := 0) r Where car_id NOT IN 
   (
    Select Car_id From
      (Select GROUP_CONCAT(t1.car_id) car_id FROM Table1 as t1) t1e 
       WHERE car_id IS NOT NULL GROUP BY car_id

      ) 
  ) tab2 
  ON   tab1.rank = tab2.rank) t2a
on t1a.id = t2a.id
SET t1a.car_id = t2a.car_ID
;
id  name    address     car_id
 1  Alex    US          2
 2  Jaso    Canad a     1
 3  Paso    Canad a     3
 4  Paso    danad a     4