MySQL 5.5中多表更新的正确语法
我试图验证在MySQL 5.5中执行多表更新时使用的语法是否正确。我有两个表,第一个表的结构如下:MySQL 5.5中多表更新的正确语法,mysql,Mysql,我试图验证在MySQL 5.5中执行多表更新时使用的语法是否正确。我有两个表,第一个表的结构如下: | *post_id* | lat | long | 其中,post_id是唯一标识符。第二个表是Wordpress PosteTa表: | *meta_id* | post_id | meta_key | meta_value | 其中meta_id是唯一标识符。来自第一个表的Post_ID与第二个表匹配。第二个表中的一些meta_键包括list lat和list long 我希望用第二个表
| *post_id* | lat | long |
其中,post_id是唯一标识符。第二个表是Wordpress PosteTa表:
| *meta_id* | post_id | meta_key | meta_value |
其中meta_id是唯一标识符。来自第一个表的Post_ID与第二个表匹配。第二个表中的一些meta_键包括list lat和list long
我希望用第二个表中的相应值更新第一个表中的long值,其中long为0.000000,lat不是0.000000。以下select语句标识了130行:
SELECT * FROM bch_postmeta
JOIN bch_coords ON bch_coords.post_id = bch_postmeta.post_id
WHERE bch_coords.long = 0.000000
AND bch_coords.lat <> 0.000000 AND bch_postmeta.meta_key = 'list-long'
UPDATE bch_coords
SET bch_coords.long = 0.0
WHERE bch_coords.long = 0.000000 AND bch_coords.lat <> 0.000000
所以,我有一个数据集,看起来像这样
SELECT * FROM bch_coords;
+---------+------+------+
| post_id | lat | long |
+---------+------+------+
| 1 | 16 | 137 |
| 2 | 0 | 0 |
| 3 | -15 | 0 |
| 4 | 136 | 0 |
| 5 | -87 | 56 |
+---------+------+------+
SELECT * FROM bch_postmeta;
+---------+---------+-------------+---------------+
| meta_id | post_id | meta_key | meta_value |
+---------+---------+-------------+---------------+
| 1 | 1 | 'list-lat' | 15.986132 |
| 2 | 1 | 'list-long' | 136.82515 |
| 3 | 1 | 'country' | 'Switzerland' |
| 4 | 1 | 'state' | 'Valais' |
| 5 | 2 | 'list-lat' | 0.000000 |
| 6 | 2 | 'list-long' | 0.000000 |
| 7 | 2 | 'country' | 'Australia' |
| 8 | 3 | 'list-lat' | -15.00 |
| 9 | 3 | 'list-long' | 173.62198 |
| 10 | 3 | 'country' | 'USA' |
| 11 | 4 | 'list-lat' | 136.32067 |
| 12 | 4 | 'list-long' | 5.123997 |
| 13 | 5 | 'list-lat' | -88.125 |
| 14 | 5 | 'list-long' | 56.12396 |
+---------+---------+-------------+---------------+
SELECT * FROM bch_coords;
+---------+------+------+
| post_id | lat | long |
+---------+------+------+
| 1 | 16 | 137 |
| 2 | 0 | 0 |
| 3 | -15 | 173 |
| 4 | 136 | 5.1 |
| 5 | -87 | 56 |
+---------+------+------+
…在更新之后,我想要一个如下所示的数据集
SELECT * FROM bch_coords;
+---------+------+------+
| post_id | lat | long |
+---------+------+------+
| 1 | 16 | 137 |
| 2 | 0 | 0 |
| 3 | -15 | 0 |
| 4 | 136 | 0 |
| 5 | -87 | 56 |
+---------+------+------+
SELECT * FROM bch_postmeta;
+---------+---------+-------------+---------------+
| meta_id | post_id | meta_key | meta_value |
+---------+---------+-------------+---------------+
| 1 | 1 | 'list-lat' | 15.986132 |
| 2 | 1 | 'list-long' | 136.82515 |
| 3 | 1 | 'country' | 'Switzerland' |
| 4 | 1 | 'state' | 'Valais' |
| 5 | 2 | 'list-lat' | 0.000000 |
| 6 | 2 | 'list-long' | 0.000000 |
| 7 | 2 | 'country' | 'Australia' |
| 8 | 3 | 'list-lat' | -15.00 |
| 9 | 3 | 'list-long' | 173.62198 |
| 10 | 3 | 'country' | 'USA' |
| 11 | 4 | 'list-lat' | 136.32067 |
| 12 | 4 | 'list-long' | 5.123997 |
| 13 | 5 | 'list-lat' | -88.125 |
| 14 | 5 | 'list-long' | 56.12396 |
+---------+---------+-------------+---------------+
SELECT * FROM bch_coords;
+---------+------+------+
| post_id | lat | long |
+---------+------+------+
| 1 | 16 | 137 |
| 2 | 0 | 0 |
| 3 | -15 | 173 |
| 4 | 136 | 5.1 |
| 5 | -87 | 56 |
+---------+------+------+
试试这个:
UPDATE bch_coords
SET bch_coords.long = (SELECT bch_postmeta.meta_value
FROM bch_postmeta
WHERE bch_postmeta.post_id = bch_coords.post_id
AND bch_postmeta.meta_key = 'list-long'
LIMIT 1)
WHERE bch_coords.long = 0.000000
AND bch_coords.lat <> 0.000000
或者这个:
UPDATE bch_coords
INNER JOIN bch_postmeta ON (bch_coords.post_id = bch_postmeta.post_id AND bch_postmeta.meta_key = 'list-long')
SET bch_coords.long = bch_postmeta.meta_value
WHERE bch_coords.long = 0.000000
AND bch_coords.lat <> 0.000000
顺便说一句,比实际问题更有趣的是,有时会忘记,如果仔细构造,视图可以用来更新其基础表。考虑以下事项:
SELECT * FROM bch_postmeta;
+---------+---------+-------------+---------------+
| meta_id | post_id | meta_key | meta_value |
+---------+---------+-------------+---------------+
| 1 | 1 | 'list-lat' | 15.986132 |
| 2 | 1 | 'list-long' | 136.82515 |
| 3 | 1 | 'country' | 'Switzerland' |
| 4 | 1 | 'state' | 'Valais' |
| 5 | 2 | 'list-lat' | 0.000000 |
| 6 | 2 | 'list-long' | 0.000000 |
| 7 | 2 | 'country' | 'Australia' |
| 8 | 3 | 'list-lat' | -15.00 |
| 9 | 3 | 'list-long' | 173.62198 |
| 10 | 3 | 'country' | 'USA' |
| 11 | 4 | 'list-lat' | 136.32067 |
| 12 | 4 | 'list-long' | 5.123997 |
| 13 | 5 | 'list-lat' | -88.125 |
| 14 | 5 | 'list-long' | 56.12396 |
+---------+---------+-------------+---------------+
CREATE VIEW v_bch_postmeta AS
SELECT a.post_id
, a.meta_value list_lat
, b.meta_value list_long
, c.meta_value country
, d.meta_value state
FROM bch_postmeta a
LEFT
JOIN bch_postmeta b
ON b.post_id = a.post_id
AND b.meta_key = "'list-long'"
LEFT
JOIN bch_postmeta c
ON c.post_id = a.post_id
AND c.meta_key = "'country'"
LEFT
JOIN bch_postmeta d
ON d.post_id = a.post_id
AND d.meta_key = "'state'"
WHERE a.meta_key = "'list-lat'";
Query OK, 0 rows affected (0.01 sec)
SELECT * FROM v_bch_postmeta;
+---------+-----------+-----------+---------------+----------+
| post_id | list_lat | list_long | country | state |
+---------+-----------+-----------+---------------+----------+
| 1 | 15.986132 | 136.82515 | 'Switzerland' | 'Valais' |
| 2 | 0.000000 | 0.000000 | 'Australia' | NULL |
| 3 | -15.00 | 173.62198 | 'USA' | NULL |
| 4 | 136.32067 | 5.123997 | NULL | NULL |
| 5 | -88.125 | 56.12396 | NULL | NULL |
+---------+-----------+-----------+---------------+----------+
UPDATE v_bch_postmeta SET list_lat = 1.0 WHERE post_id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
SELECT * FROM bch_postmeta;
+---------+---------+-------------+---------------+
| meta_id | post_id | meta_key | meta_value |
+---------+---------+-------------+---------------+
| 1 | 1 | 'list-lat' | 15.986132 |
| 2 | 1 | 'list-long' | 136.82515 |
| 3 | 1 | 'country' | 'Switzerland' |
| 4 | 1 | 'state' | 'Valais' |
| 5 | 2 | 'list-lat' | 1.0 |
| 6 | 2 | 'list-long' | 0.000000 |
| 7 | 2 | 'country' | 'Australia' |
| 8 | 3 | 'list-lat' | -15.00 |
| 9 | 3 | 'list-long' | 173.62198 |
| 10 | 3 | 'country' | 'USA' |
| 11 | 4 | 'list-lat' | 136.32067 |
| 12 | 4 | 'list-long' | 5.123997 |
| 13 | 5 | 'list-lat' | -88.125 |
| 14 | 5 | 'list-long' | 56.12396 |
+---------+---------+-------------+---------------+
这不适用于视图中的空值第一个生成错误:1054-未知列“字段列表”中的“SELECTbch_Posteta.meta_value”。第二个影响0行。实际上我已经尝试了第二种方法,尽管我将meta_键限制作为WHERE子句的一部分。谢谢你回复@David。您还有其他建议吗?在“SELECTbch_Posteta.meta_值”中,我发现SELECT和bch_Posteta.meta_值之间没有空格。这可能是导致错误SqlFiddle出现的原因:期望的结果是将post_id编号3和4的经度值从bch_Posteta复制到bch_coords。其他行不应受到影响。如果mysql没有实际更改您尝试更新的字段的值,则受影响的值将为0。您正在设置bch_coords.long=0,其中bch_coords.long=0。所以这里没有变化,没有行受到影响。在这个例子中,两行应该受到影响-那些与post_id 3和4匹配的行。请注意,0.0并不等于0.000000@KorreyD。如果我从UPDATE语句中删除bch_Posteta,则更新将影响130行。一旦我将bch_Posteta添加到UPDATE语句中,0行就会受到影响。0.0等于0.000这是一条有趣且方便的信息,但无法帮助解决我的特定问题。