更新用户配置文件时,mysql语法显示错误

时间:2014-11-21 12:45:56

标签: mysql sql wordpress

我正在尝试使用sql查询来更改wp_usermeta中的某些字段以及何时放入此代码段:

 UPDATE wp_usermeta
 SET meta_value = IF("meta_key" = 'first_name', '{firstname}', IF("meta_key" = 'last_name', '{lastname}', "meta_value"))
 WHERE user_id =
 (SELECT "user_id" FROM
 (SELECT MAX("user_id") AS "user_id"
 FROM wp_usermeta) AS `reg`)
 AND ("meta_key" = 'first_name'
 OR "meta_key" = 'last_name')

SQL工作正常。但是,当我想在此代码段中添加新的meta_key时,它会显示错误:

 UPDATE wp_usermeta
  SET meta_value = IF("meta_key" = 'first_name', '{firstname}', IF("meta_key" = 'last_name', '{lastname}', IF("meta_key" = 'telephone', '{phone}', "meta_value"))
  WHERE user_id =
   (SELECT "user_id" FROM
   (SELECT MAX("user_id") AS "user_id"
  FROM wp_usermeta) AS `reg`)
  AND ("meta_key" = 'first_name'
   OR "meta_key" = 'last_name'
   OR "meta_key" = 'telephone')

SQL语法中存在错误 - ;检查与MySQL服务器版本对应的手册,以便在“WHERE

附近使用正确的语法

请帮我解决这个问题。我只是开始使用MySQL并且不太了解。

1 个答案:

答案 0 :(得分:0)

以下是您的查询的开头:

UPDATE wp_usermeta
    SET meta_value = IF("meta_key" = 'first_name', '{firstname}',
                        IF("meta_key" = 'last_name', '{lastname}',
                            IF("meta_key" = 'telephone', '{phone}', "meta_value"
                              )
                          )
-----------------------^

(有一个原因可以让优秀的程序员对格式化感到疯狂;它可以防止这样的大量错误。)

问题是你错过了一个关闭的人。您应该使用case(标准SQL)编写此代码:

UPDATE wp_usermeta
    SET meta_value = (CASE WHEN meta_key = 'first_name' THEN '{firstname}'
                           WHEN meta_key = 'last_name' THEN '{lastname}'
                           WHEN meta_key = 'telephone' THEN '{phone}'
                           ELSE meta_value
                       END)
    WHERE user_id = (SELECT user_id
                     FROM (SELECT MAX(user_id) AS user_id
                           FROM wp_usermeta
                          ) reg
                    ) AND
          meta_key IN ('first_name', 'last_name', 'telephone');

除非你真的需要,否则不要使用引号作为列名。如果必须,请更改名称,这样您就不必这样做了。

编辑:

您也可以将其写为:

UPDATE wp_usermeta
    SET meta_value = (CASE WHEN meta_key = 'first_name' THEN '{firstname}'
                           WHEN meta_key = 'last_name' THEN '{lastname}'
                           WHEN meta_key = 'telephone' THEN '{phone}'
                           ELSE meta_value
                       END)
    WHERE meta_key IN ('first_name', 'last_name', 'telephone')
    ORDER BY user_id DESC
    LIMIT 1;