2012-04-12 64 views
1

我正在努力与此查询,并想知道如果我浪费我的时间,需要编写一个PHP脚本或类似下面的事实可能吗?在mysql更新查询中创建变量并重用?可能?

UPDATE my_table 
SET @userid = user_id 
AND SET filename('http://pathto/newfilename_'@userid'.jpg') 
FROM my_table 
WHERE filename 
LIKE '%_%' AND filename 
LIKE '%jpg'AND filename 
NOT LIKE 'http%'; 

基本上我有700页需要在数据库中重命名为为我改变系统不匹配文件名的文件多,他们被称为在数据库中。 格式2_gfhgfhf.jpg翻译为userid_randomjumble.jpg

,但不是在数据库中的所有文件都是这种格式只有大约700出千。所以我想识别包含_的名称,但不包含http(即我不想触摸的正确格式)。

我可以做到这一点,但现在来了棘手的一点!

我想用http://pathto/filename_userid.jpg替换那个文件名userid_randomjumble.jpg所以我想将该行的user_id设置为一个变量并将其插入到我的新文件名中。

上述不起作用的显而易见的原因,但我不知道是否有办法我想要做的。我不知道这是否可能?我是否浪费了我的时间,并且应该使用mysql转向PHP并停止懒惰?还是有办法让这个工作?

+0

'$ SQL =“SELECT USER_ID从MY_TABLE WHERE文件名LIKE'%_%'和文件名LIKE'%jpg'和文件名不像'http%''“; $ freetplquery = mysql_query($ sql); while($ update = mysql_fetch_array($ freetplquery)){\t $ userid = $ update [“user_id”]; 的mysql_query( “UPDATE SET MY_TABLE = user_avatar的 'http:// pathto/newfilename_” $用户ID “.JPG'。WHERE USER_ID =” $用户ID “”);}' 写脚本而予正在等着,所以现在全部排序谢谢。但是,我仍然很有兴趣,如果它可能不使用PHP? – 2012-04-12 02:39:04

回答

0

是的,你可以使用简单的SQL做到这一点:

UPDATE my_table 
SET filename = CONCAT('http://pathto/newfilename_', userid, '.jpg') 
WHERE filename LIKE '%\_%jpg' 
AND filename NOT LIKE 'http%'; 

注:

  • 无需变量。行更新的任何列可以被引用
  • 在MySQL中,使用CONCAT()添加文本值加在一起
  • 随着LIKE,下划线(_)有着特殊的意义 - 它意味着“任何单个字符”。如果要匹配文本的下划线,你必须用一个反斜杠转义(\
  • 您的两个LIKE断言可以安全地合并成一个简单的查询
+0

多数民众赞成在此非常感谢,有点迟了,因为我最终使用PHP,但非常方便将来参考。谢谢 – 2012-04-14 22:23:01

1

是的,它可能没有php。下面是一个简单的例子

SET @a:=0; 
SELECT * FROM table WHERE field_name = @a; 
+0

这将字面上匹配字符串“@ a”。你的意思是'WHERE field_name = @ a' – Bohemian 2012-04-12 16:57:56

+0

@波希米亚,抱歉TYPO ......感谢你的建议。 – Starx 2012-04-12 16:58:47