Укажите целевую таблицу для обновления в предложении FROM MySql 8 - PullRequest
1 голос
/ 25 мая 2020

В базе данных MySQL у меня есть две таблицы

tmp1

mysql> SELECT * FROM `tmp1`;
+-----+---------------------+-----------+----------------+--------+
| sID | sDate_sHour         | sName     | sStatus        | sValue |
+-----+---------------------+-----------+----------------+--------+
|   1 | 2019-04-27 14:00:52 | user76681 | not registered | NULL   |
|   2 | 2019-05-08 09:39:19 | user76681 | not registered | NULL   |
+-----+---------------------+-----------+----------------+--------+
2 rows in set 

и tmp2

mysql> SELECT * FROM `tmp2`;
+-----+---------------------+-----------+------------+
| sID | sDate_sHour         | sName     | sStatus    |
+-----+---------------------+-----------+------------+
|   1 | 2019-05-08 09:36:14 | user76681 | registered |
+-----+---------------------+-----------+------------+
1 row in set

Когда я на tmp2 для того же sName sDate_sHour выше, чем sDate_sHour из tmp1 Мне нужно обновить столбец sValue с N значением

вернуть tmp1 после обновления

mysql> SELECT * FROM `tmp1`;
+-----+---------------------+-----------+----------------+--------+
| sID | sDate_sHour         | sName     | sStatus        | sValue |
+-----+---------------------+-----------+----------------+--------+
|   1 | 2019-04-27 14:00:52 | user76681 | not registered | N      |
|   2 | 2019-05-08 09:39:19 | user76681 | not registered | NULL   |
+-----+---------------------+-----------+----------------+--------+
2 rows in set 

, потому что дата 2019-05-08 09:36:14 из tmp2 больше 2019-04-27 14:00:52 из tmp1, а дата 2019-05-08 09:36:14 из tmp2 меньше 2019-05-08 09:39:19 из tmp1

Я пробовал использовать MySQL 8.0.17

Я получаю ошибку компиляции при попытке запустить следующий MYSQL оператор обновления

mysql> UPDATE tmp1 AS b
INNER JOIN tmp2 g ON b.sName = g.sName
SET b.sValue = 'N'
WHERE
    g.sDate_sHour > (
        SELECT
            MAX(b.sDate_sHour)
        FROM
            `tmp1` t2
        WHERE
            t2.sName = b.sName
        ORDER BY
            t2.sID DESC
    )
AND b.sStatus IN ('not registered')
AND b.sName = g.sName
ORDER BY
    g.sDate_sHour DESC;
1093 - You can't specify target table 'b' for update in FROM clause
mysql> 

Понятия не имею, в чем проблема является.

Пожалуйста, не могли бы вы мне помочь?

Структурные таблицы tmp1 и tmp2 внизу

DROP TABLE IF EXISTS `tmp1`;
CREATE TABLE `tmp1` (
  `sID` int(11) NOT NULL AUTO_INCREMENT,
  `sDate_sHour` datetime DEFAULT NULL,
  `sName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `sStatus` varchar(255) DEFAULT NULL,
  `sValue` char(1) DEFAULT NULL,
  PRIMARY KEY (`sID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tmp1
-- ----------------------------
INSERT INTO `tmp1` VALUES ('1', '2019-04-27 14:00:52', 'user76681', 'not registered', null);
INSERT INTO `tmp1` VALUES ('2', '2019-05-08 09:39:19', 'user76681', 'not registered', null);


DROP TABLE IF EXISTS `tmp2`;
CREATE TABLE `tmp2` (
  `sID` int(11) NOT NULL AUTO_INCREMENT,
  `sDate_sHour` datetime DEFAULT NULL,
  `sName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `sStatus` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`sID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tmp2
-- ----------------------------
INSERT INTO `tmp2` VALUES ('1', '2019-05-08 09:36:14', 'user76681', 'registered');

1 Ответ

1 голос
/ 25 мая 2020

Вы также не можете использовать ORDER BY в запросе обновления

Для кода ошибки просто используйте подзапрос

UPDATE tmp1 AS b
INNER JOIN tmp2 g ON b.sName = g.sName
SET b.sValue = 'N'
WHERE
    g.sDate_sHour > (
        SELECT
            MAX(b.sDate_sHour)
        FROM
            (SELECT * FROM  `tmp1`) t2
        WHERE
            t2.sName = b.sName
        ORDER BY
            t2.sID DESC
    )
AND b.sStatus IN ('not registered')
AND b.sName = g.sName
;
...