Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL 5.5中多表更新的正确语法_Mysql - Fatal编程技术网

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 我希望用第二个表

我试图验证在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

我希望用第二个表中的相应值更新第一个表中的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这是一条有趣且方便的信息,但无法帮助解决我的特定问题。