1.例如表格裡某字段格式如下:資料1|||||資料2|||||資料3
2.現在想要把資料分割成$data[0],$data[1],$ data[3],然後order by $data[3]
3.請問能實現嗎?
4.完全小白,描述可能不規範,但意思應該說明白了。
1.例如表格裡某字段格式如下:資料1|||||資料2|||||資料3
2.現在想要把資料分割成$data[0],$data[1],$ data[3],然後order by $data[3]
3.請問能實現嗎?
4.完全小白,描述可能不規範,但意思應該說明白了。
能實現,如果在MySQL層面實現可能會導致資料庫壓力比較大.
可以考慮在PHP程式這邊排好序,然後再根據ID序列從MySQL取資料.
<code><?php header('Content-Type: text/plain; charset=utf-8'); //$db = new mysqli('127.0.0.1','user','pass','dbname',3306); //$arr = $db->query('SELECT id,field FROM table')->fetch_all(MYSQLI_ASSOC); //假设取出来的数据结构如下 $arr = array( array('id' => 1, 'field' => '数据1|||||数据2|||||256'), array('id' => 2, 'field' => '数据1|||||数据2|||||128'), array('id' => 3, 'field' => '数据1|||||数据2|||||512'), ); foreach($arr as $k => $v) { //把field字段的内容转成一个数组比如array('数据1','数据2','256'),方便后面排序 $arr[$k]['field'] = explode('|||||', $v['field']); } //根据field字段里的第三个元素对数组进行排序 uasort($arr, function($a, $b) { if($a['field'][2]===$b['field'][2]) return 0; //下面这句话的意思就是,如果前面的a大过后面的b,就返回1,返回1表示交换顺序,也就是小的数在前面,由小到大升序排列. else return ($a['field'][2] > $b['field'][2]) ? 1 : -1; }); foreach($arr as $k => $v) { $ids[] = $v['id']; } $ids = implode(',', $ids); //ID序列为2,1,3 //按照ID序列的顺序查询MySQL //SQL语句为 SELECT * FROM table WHERE id IN(2,1,3) ORDER BY FIELD(id,2,1,3) $sql = "SELECT * FROM table WHERE id IN($ids) ORDER BY FIELD(id,$ids)"; //$ret = $db->query($sql)->fetch_all();</code>
如果資料量很大,可以考慮把PHP排好的ID序列緩存起來.
ORDER BY FIELD(id,$ids) 這個操作在資料量大時也會產生效能問題,
這時可以考慮根據實際情況將$ids切分,例如第一頁0到19排序20條,第二頁類推,這樣小資料量的自訂排序對MySQL壓力就小得多了.
這個跟php沒什麼關係。你可以用mysql建立一個function,然後用function來排序:
<code>CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT) RETURNS VARCHAR(255) RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos), LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1), delim, '');</code>
<code>SELECT * FROM test_table order by SPLIT_STRING(test_tablecol, '|||', 3);</code>
能實現,很麻煩,而且效率非常低,對於這種要求通常的解決方法是修改表結構。
從純粹邏輯上來說,sql其實可以做很複雜的事情,但是你覺得如果一個查詢需要跑好幾分鐘的話被家裡人知道了會不會挨打?
建議查詢出來之後用php排序,不要用mysql排序
mysql 的substring_index