2014-01-06 4 views
1

기본적으로 사람들은 길이에 대한 검색 결과를 필터링합니다. 그러나 길이는 항목마다 다를 수 있으므로 텍스트 필드에 저장됩니다. 아이템은 16,20 미터 일 수 있고, 또 다른 아이템은 8.1 미터 일 수 있습니다.MySQL/PHP - 숫자가 아닌 필드의 숫자 값 필터링

어떻게 시작하나요? 데이터베이스에서 가능한 모든 값을 가져와 필터링 된 형식으로 변경하고 (모든 것을 구문 분석하여 쉼표로 구분)? 연결된 ID를 가져온 다음 해당 ID와 관련된 모든 정보 만 표시하거나 거기에 있습니다. 내가 아직 못 찾았던 방법?

친절하게 제공합니다.

편집 : 표준화 형식은 해결책이지만이 상황에서는 적용 할 수 없습니다. 나는 이것을 할 수 없다. 악화됩니다 - 필터링은 최소값과 최대 값을 모두 가질 수 있습니다. 최소 : 4 및 최대 : 8은 해당 길이 사이의 모든 것을 표시해야합니다. 6.1m, 7,82m, 5

+1

값과 측정 단위를 두 개의 필드로 나눌 수있는 데이터를 표준화해야합니다. – frlan

+0

나는 정말로해야하고, 나는 정말로 할 수 있으면 좋겠다. 그러나, 이것은 다른 누군가의 프로젝트이며, 나는 슬프게도 그것을 바꿀 수 없으며 변경할 수 없습니다. – Mave

+0

코어 테이블을 변경할 필요는 없지만 미러 테이블을 올바르게 작성하고 미러 테이블에서 검색 할 수 있습니다. 미러 테이블은 크기와 업데이트 빈도에 따라 매시간마다 처음부터 다시 만들 수 있습니다. 또는 깨진 테이블에'updated_at' 열이 있으면 10 분마다 거의 동일하게 동기화 상태를 유지할 수 있습니다. – halfer

답변

1

나는 데이터베이스 (길이 자체에 대한 별도의 필드를 유지한다 표준화 설정 한 방식을 변경할 수 있기 때문에 , float/double 및 부록에 대한 필드), 나는이 접근법을 사용하기로 결정했습니다.

먼저 모든 가능한 다음 길이 얻을 : 페이지를 가정

foreach($lengths as $length) { 
$cLengths[$length['item_id']] = preg_replace("/[^0-9,.]/", "", str_replace(',', '.', $length['field_value'])); 
} 

은 다음 & MINLENGTH URL에 = 2 & 최대 길이 = 10 호출 할 것이다 :

$minLength = $_GET['minLength']; 
$maxLength = $_GET['maxLength']; 
if(!is_null($minLength) && !is_null($maxLength)) { 
$filteredItems = ''; 
foreach($cLengths as $itemId => $cL) { 
    if($cL >= $minLength && $cL <= $maxLength) { 
    $filteredItems .= $itemId . ','; 
    } 
} 
$filteredItems = substr($filteredItems, 0, -1); 
$where .= 'item_id IN(' . $filteredItems . ') AND '; 
} 
0

길이 형식을 표준화하는 것이 좋습니다. 다른 형식으로 저장된 숫자 값을 필터링하는 것은 어렵습니다.

당신은 문자열에있는 패턴을 검색하는 LIKE 연산자를 사용할 수 있습니다

SELECT * FROM table WHERE length LIKE '%filtervalue%' 
+0

악화됩니다. 최소값과 최대 값을 모두 가져야합니다. 그 중 하나는 비어있을 수 있으며, 둘 다 비어있을 수 있습니다. 둘 다 초기화 될 수 있습니다. – Mave

+1

확실히 포맷을 정규화해야합니다. 그것을 할 수있는 함수를 작성해야합니다 (모든 가능한 값에 따라 입력을 분석하고 정규화 된 (float) 값을 반환합니다). DB에 값을 저장하고 정규화 된 값을 저장하기 전에이 함수를 사용하는 것이 더 좋습니다 (원래 값이 필요할 경우에 대비하여 테이블에 새 열을 추가 할 수 있습니다). SQL을 사용하여 쉽게 값을 필터링 할 수 있습니다.DB를 수정할 수 없으면 모든 행을 선택하고 PHP에서 필터링 (이전과 같은 기능 사용)해야하지만 성능 문제가 발생할 수 있습니다. – kormik

+0

제 편집문에서 설명하고 다른 답변에 대한 답변으로 - 할 수 있으면 좋겠지 만 할 수는 없습니다. 그건 의문의 여지가있다. 저를 믿으십시오, 저것은 나가에 첫째로 뛰어 올랐다, 그러나 아무도는 할 수 있지 않는다. – Mave

0

단순히 것 쿼리 중에 표준을 적용합니다. 당신의 길이 열을 가정하면 "길이"라는 당신은 테이블 "테이블"입니다 쿼리입니다 :

SELECT something, replace(length,',','.') + 0 as mylen FROM `table` HAVING mylen BETWEEN 16.2 AND 18 

그것은 매우 빠르지 않을 것이다, 당신은 또한 곳에서 직접 + 0을 대체 사용할 수 있습니다, 그것은 HAVING의 필요성을 제거 할 것 즉 :

SELECT something FROM `table` replace(length,',','.') + 0 BETWEEN 16.2 AND 18 

행운을 빌어 요!

관련 문제