Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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
Php 替换为MySQL中的IF条件和LIKE语句_Php_Mysql_Sql - Fatal编程技术网

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”。因此,输出是“不一致的”。我已经运行了代码。在您的情况下,一个可能的答案是使用:以便您可以将下划线和破折号视为文字字符。我只是想解释一下为什么代码没有像你期望的那样工作