Php 替换为MySQL中的IF条件和LIKE语句
在我的数据库中,有这样一个表:Php 替换为MySQL中的IF条件和LIKE语句,php,mysql,sql,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列中
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中是否为下划线格式。对于新的复制结果,它应该始终以破折号分隔,如下所示:
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
的情况下,它不起作用。请检查并建议此问题的解决方案,以获取虚线url 如果模式相同,您可能可以使用substring\u 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)
它们是不同的,一个是我要替换
。
一次,另一个是-
一次。我怀疑你遇到了之类的通配符问题。1) image\u url,如“%house\u id\u%”
这适用于所有模式值,这些模式值如下:house\u id+
任何单个字符
,因为通配符下划线
匹配所有字符!因此,else
表达式永远不会执行!唉,您只替换了确切的模式:“house\u id\u 52”
这里下划线被视为“literal”。因此,输出是“不一致的”。我已经运行了代码。在您的情况下,一个可能的答案是使用:以便您可以将下划线和破折号视为文字字符。我只是想解释一下为什么代码没有像你期望的那样工作