[请益] mysql REGEXP 方法

楼主: kiey (炼)   2016-07-18 16:33:08
小弟现在有个问题想请问一下各位先进
有张 table
table name : projects
projects.code 如下:
11&22
11&22|22&33
92&71|22&92|55&33
我有18组号码,分别要去找出这字段里面有符合的
例如号码是 11 , 22 , 34
这样的话只要是 11&22 or 22&34 or 11&34 都符合
“|” 是分隔符号,被它区分的只要有一组符合就可以了
例如:
11&22 : O
22&99 : X
11&22|22&33 : O
92&71|22&92|55&33 : X
我的写法是这样:
<?php
//table name : projects
//projects.code 如下:
//11&22
//11&22|22&33
//92&71|22&92|55&33
$aCodes = array(11, 22, 33, 44, 55,
66, 77, 88, 99, 10,
21, 31, 41, 51, 61, 71, 81, 91);
$sRegExp = " `projects.type` like '1' ";
$sql = " (1 = 2) ";
foreach ($aCodes as $iKey1 => $sValue1) {
foreach ($aCodes as $iKey2 => $sValue2) {
if ($iKey1 != $iKey2 ) {
$sql .= " OR ";
$sql .= ' (`projects.code` ' .
' REGEXP "^.*' . $sValue1 . '&' . $sValue2 . '.*$") ';
}
}
}
$sRegExp = ' AND( '.$sql.' )';
$this->oDB->query( "UPDATE `projects`
SET `updatetime`='".date("Y-m-d H:i:s")
."' WHERE $sRegExp " );
?>
mysql:
UPDATE `projects`
SET `updatetime`='".date("Y-m-d H:i:s")
WHERE `projects.type` like '1'
AND ( 1=2
OR REGEXP "^.*11&22*$"
OR REGEXP "^.*11&33*$"
OR REGEXP "^.*11&44*$"
...
OR REGEXP "^.*22&11*$"
OR REGEXP "^.*22&33*$"
OR REGEXP "^.*22&44*$"
...
OR REGEXP "^.*33&11*$"
OR REGEXP "^.*33&22*$"
OR REGEXP "^.*33&44*$"
...
< 重复 18*17 次>
)
效果是没错,但是一直觉得这样写很丑
而且之后可能会有 三组(11&22&33) 四组(11&22&33&44).. 的写法
可是这样就要用三个 loop 四个 loop 下去跑了
sql 丑就算了 php 也很没效率的感觉
不知道有哪位先进可以指导一二
谢谢
作者: MOONRAKER (㊣牛鹤鳗毛人)   2016-07-18 16:56:00
你写(11|22|34)&(11|22|34)不就结了不然就通通取出来再explode()两次除非你每秒要跑10次以上 太在意效率没什么意思
楼主: kiey (炼)   2016-07-18 17:36:00
有18组号码 11&22 or 22&34 or 11&34 .. 会有 18 * 17 次projects 一次会有几万笔资料projects.code 可能会有 12&23|23&34|34&45|45&56..不限几次补上 MYSQL
作者: shadowjohn (转角遇到爱)   2016-07-18 18:02:00
SQL的语法也有长度限制,这样作也不太行
作者: GALINE (天真可爱CQD)   2016-07-19 00:38:00
从你的内文我看不出一楼的解法为何不能用...然后一个字段放了多组的二维资料,如果做得到的话还是另外开一个 table 存资料比较好....如果真的有量且在意效能,别用regexp扫大table吃不到 index 的..
作者: locklose (允)   2016-07-19 01:35:00
同意楼上,没有index的explain会告诉你你正在遭报应
楼主: kiey (炼)   2016-07-19 08:47:00
今天仔细看 一楼方法好像就可以了XD .. 谢谢
作者: MOONRAKER (㊣牛鹤鳗毛人)   2016-07-19 10:08:00
除非你还要考虑顺序 比如说11&22可以 22&11不行不然(11|22|...)这样在regex没什么问题 MySQL也支援(开console来跑过了 才会跟你讲可以)

Links booklink

Contact Us: admin [ a t ] ucptt.com