php mysql 선택은 폭발 필드를 지원하고 값에 따라 정렬합니까?

WBOY
풀어 주다: 2016-08-04 09:20:21
원래의
1086명이 탐색했습니다.

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

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿