1. 예를 들어 테이블의 필드 형식은 다음과 같습니다. data 1|||||data 2|||||data 3
2 이제 데이터를 $로 분할하려고 합니다. data[0],$data[1], $data[3], 그리고 $data[3]
3로 주문할 수 있나요?
4. 완전 초보자라면 설명이 표준화되어 있지 않을 수도 있지만 의미는 명확해야 합니다.
1. 예를 들어 테이블의 필드 형식은 다음과 같습니다. data 1|||||data 2|||||data 3
2 이제 데이터를 $로 분할하려고 합니다. data[0],$data[1], $data[3], 그리고 $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를 분할하는 것을 고려할 수 있습니다. 예를 들어 첫 번째 페이지에서는 20개의 항목을 0부터 19까지 정렬하고 두 번째 페이지에서는 이러한 방식으로 작은 데이터 양을 사용자 정의 정렬합니다. MySQL에 대한 부담이 훨씬 줄어듭니다.
php와는 관련이 없습니다. mysql로 함수를 생성한 다음 해당 함수를 사용하여 정렬할 수 있습니다.
<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은 실제로 매우 복잡한 작업을 수행할 수 있지만 쿼리를 실행하는 데 몇 분 정도 걸리고 가족이 알게 되면 패배할 것이라고 생각하시나요?
쿼리 후 정렬은 mysql이 아닌 php를 사용하는 것을 권장합니다
mysql의 substring_index