用MySQL

时间:2015-06-02 12:19:35

标签: php mysql sql

在我的数据库中,我有一个这样的表:

id  image_url                               house_id
1   /upload/house-id-52_myimagename1.jpg        52
2   /upload/house_id_52_myimagename2.jpg        52
3   /upload/house-id-52_myimagename3.jpg        52

我想使用SQL查询复制它,但希望image_url列中的图像名称始终带有" house-id- {house_id}"这种格式,无论它是否在以前的id中采用下划线格式。对于新的重复结果,IT应始终以短划线分隔,如下所示:

id  image_url                               house_id
4   /upload/house-id-53_myimagename1.jpg        53
5   /upload/house-id-53_myimagename2.jpg        53
6   /upload/house-id-53_myimagename3.jpg        53

我已经对此进行了查询:

INSERT INTO house_gallery (image_url, house_id) 
    (SELECT 
        IF(image_url LIKE '%house_id_%',
            replace(image_url, 'house_id_52', 'house-id-53'),
            replace(image_url, 'house-id-52', 'house-id-53')) 
        AS `image_url`, 53 AS house_id 
    FROM house_gallery WHERE house_id = 52)

house-id-52的情况不适用。请检查并告知可能是什么解决方案,以获得虚线网址。

1 个答案:

答案 0 :(得分:1)

如果模式相同,您可以使用substring_index函数。请考虑以下

mysql> select * from image ;
+------+--------------------------------------+----------+
| id   | image_url                            | house_id |
+------+--------------------------------------+----------+
|    1 | /upload/house-id-52_myimagename1.jpg |       52 |
|    2 | /upload/house_id_52_myimagename2.jpg |       52 |
|    3 | /upload/house-id-52_myimagename3.jpg |       52 |
+------+--------------------------------------+----------+

select 
case 
 when 
  substring_index(substring_index(image_url,'/',-1),'_',1) = 'house' 
  then replace(image_url,'house_id_52','house-id-53') 
  else 
   replace(image_url, 'house-id-52', 'house-id-53') 
end  as modified 
from image ;

你会得到

+--------------------------------------+
| modified                             |
+--------------------------------------+
| /upload/house-id-53_myimagename1.jpg |
| /upload/house-id-53_myimagename2.jpg |
| /upload/house-id-53_myimagename3.jpg |
+--------------------------------------+

现在让我们创建另一个表

mysql> create table image_copy like image ;
Query OK, 0 rows affected (0.11 sec)

mysql> describe image_copy;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id        | int(11)      | YES  |     | NULL    |       |
| image_url | varchar(100) | YES  |     | NULL    |       |
| house_id  | int(11)      | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

所以插入查询是

insert into image_copy 
select 
id,
case 
 when 
  substring_index(substring_index(image_url,'/',-1),'_',1) = 'house' 
  then replace(image_url,'house_id_52','house-id-53') 
  else 
  replace(image_url, 'house-id-52', 'house-id-53') 
end  as image_url,
'53'  
from image 
where house_id = 52
;

mysql> select * from image_copy ;
+------+--------------------------------------+----------+
| id   | image_url                            | house_id |
+------+--------------------------------------+----------+
|    1 | /upload/house-id-53_myimagename1.jpg |       53 |
|    2 | /upload/house-id-53_myimagename2.jpg |       53 |
|    3 | /upload/house-id-53_myimagename3.jpg |       53 |
+------+--------------------------------------+----------+
3 rows in set (0.00 sec)