看板 PHP 關於我們 聯絡資訊
小弟現在有個問題想請問一下各位先進 有張 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 也很沒效率的感覺 不知道有哪位先進可以指導一二 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.125.155.100 ※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1468830790.A.C86.html
MOONRAKER: 你寫(11|22|34)&(11|22|34)不就結了 07/18 16:56
MOONRAKER: 不然就通通取出來再explode()兩次 07/18 16:57
MOONRAKER: 除非你每秒要跑10次以上 太在意效率沒什麼意思 07/18 16:58
kiey: 有18組號碼 11&22 or 22&34 or 11&34 .. 會有 18 * 17 次 07/18 17:36
kiey: projects 一次會有幾萬筆資料 07/18 17:37
kiey: projects.code 可能會有 12&23|23&34|34&45|45&56..不限幾次 07/18 17:38
※ 編輯: kiey (59.125.155.100), 07/18/2016 17:40:42
kiey: 補上 MYSQL 07/18 17:40
shadowjohn: SQL的語法也有長度限制,這樣作也不太行 07/18 18:02
GALINE: 從你的內文我看不出一樓的解法為何不能用... 07/19 00:38
GALINE: 然後一個欄位放了多組的二維資料,如果做得到的話還是 07/19 00:39
GALINE: 另外開一個 table 存資料比較好.... 07/19 00:40
GALINE: 如果真的有量且在意效能,別用regexp掃大table 07/19 00:44
GALINE: 吃不到 index 的.. 07/19 00:46
locklose: 同意樓上,沒有index的explain會告訴你你正在遭報應 07/19 01:35
kiey: 今天仔細看 一樓方法好像就可以了XD .. 謝謝 07/19 08:47
MOONRAKER: 除非你還要考慮順序 比如說11&22可以 22&11不行 07/19 10:08
MOONRAKER: 不然(11|22|...)這樣在regex沒什麼問題 MySQL也支援 07/19 10:09
MOONRAKER: (開console來跑過了 才會跟你講可以) 07/19 10:10