2010-02-20 6 views
12

미리보기에서 사용할 데이터베이스 필드에서 첫 번째 X 단어를 가져오고 싶습니다. 필드의 내용이mySQL에서 첫 번째 X 단어 (문자 만이 아님) 가져 오기

했다 기본적으로 경우
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris malesuada." 

나는

"Lorem ipsum dolor sit amet... see more" 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까 에코 하시겠습니까?

그때

$foo = [query_results]; 
$bar = explode(' ', $foo); 
for($x=0, $x<6, $x++){ 
    echo $bar[$x]; 
}; 
echo "... see more" 

같은이에 더 나은 방법이 있습니까 할 쿼리에서 전체 필드를 끌어 할 일은 알고있는 유일한 것은?

+1

항상 적어도 6 단어가 있다고 가정하십니까? –

+0

글쎄요, 이것은 시간 낭비입니다. 예,이 솔루션은 항상 6 단어로 가정합니다. 분명히 적은 수의 가능성을 설명하기 위해 더 나은 코드를 넣을 것입니다. –

답변

14

을 다음과 같이 "공백으로 구분 된"로 단어를 정의, 당신은 여전히 ​​당신은 확실히 문자의 어떤 수를 반환합니다 SUBSTRING_INDEX을 사용하려는 쿼리에서 그것을 할 수 구분 기호의 발생에 따라 지정된 수만큼 얻을 수 있습니다.귀하의 경우에는 호출은 다음과 같을 것이다 :

SELECT SUBSTRING_INDEX(text_field, ' ', 6) FROM ... 

는 특히, 이것은 우리가 공백으로 구분 된 공간하지 않은 문자의 집합으로 단어를 정의 여섯 개 단어까지 돌아갑니다.

참고 :이 단어는 마지막 단어에 첨부 된 구두점을 반환하며 원할 수도 있고 바람직하지 않을 수도 있습니다. PHP에서 문자열의 꼬리 부분에있는 구두점 문자를 대체 할 수있을만큼 간단하지만 SQL 내부에 완전히 머물고 싶다면 TRIM을 사용할 수 있다고 생각합니다.

SELECT TRIM(TRAILING ',' FROM SUBSTRING_INDEX(text_field, ' ', 6)) FROM ... 

가 후행 문장 부호를 제거하기위한 더 나은 옵션이있을 수 있습니다 - 그러나 아마 그것은 또 다른 문제는 (나는 아직도 TRIM보다 더 나은 솔루션을 찾고 있어요)입니다 : 그의 구문은 무언가 같이 될 것입니다.

+0

답장과 답변의 이유를 설명하는 답변으로 표시하십시오. 엄청 고마워! –

0

방법 1 (더 나은) :

아니, 당신은 또한 현장에서 직접 원하는 텍스트를 가져 mysql을의 substring 기능을 사용할 수 있습니다.

프로토 타입 :

SUBSTRING(string,position) 

예 :

SELECT SUBSTRING(field, 25) FROM table 

방법 2 :

또한 같은 목적을 위해 PHP의 substr 기능을 사용할 수 있지만 먼저 것 wh를 선택해야한다. db에서 ole 필드 값. 귀하의 경우에는

$cutted = substr($row['fieldname'], 0, 25) . '.....'; // get 25 chars and append .... 

:

$str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris malesuada."; 
$parts = explode(" ", $str); 
print $parts[0] . ' ' .$parts[1] . ' ' .$parts[2] . ' ' .$parts[3] . ' ' .$parts[4] . '.....See More'; 

출력 :

Lorem ipsum dolor sit amet.....See More 
+0

OP는 단어를 계산하고 제한하는 솔루션을 요청했습니다 (공백 구분 기준) * 아닌 * 문자! –

0
SELECT SUBSTRING(`Filed_Name`,1,X) FROM `Table` where field2 = 0 

토우는 표시해야 할 문자로 문자열 절에서 X를 대체 할 수 있습니다.

+0

OP는 단어 * 문자가 아닌 ...을 표시해야합니다 ... –

5

잘 당신은 당신이 정말로 첫 번째 N 단어를 얻으려면 문자열 기능

SELECT CONCATENATE(SUBSTRING(myfield, 0, N), "... see more") FROM mytable 
당신에게 첫 번째 N 편지를 얻을 것이다

...

를 사용하여 쿼리를 수행하고 수

SELECT CONCATENATE(SUBSTRING_INDEX(myfield," ", N), "... see more") FROM mytable 
+0

CONCATENATE 또는 CONCAT입니까? CONCAT을 사용하지만 CONCATENATE를 사용하지 않으면 상황이 정상적으로 작동합니다. 나는 MySQL을 사용하고있다. – Norman

0

필자의 철학은 데이터베이스 작동을 너무 어렵게 만드는 것입니다. 필자가 경험 한 바에 따르면, MySQL은 매우 간단한 쿼리를 제공 한 다음 PHP 또는 사용하고있는 언어로 "실제"작업을 수행 할 때 훨씬 더 빠릅니다. 게시 된 제안을 따르지 않겠습니다. 전체 문자열을 잡고 스크립팅 언어 나 선택 항목으로 축소하십시오. 유일한 예외는 문자열이 잠재적으로 매우 클 수 있습니다 (예 : 50KB 이상. 이 경우 데이터베이스를 축소하면 아마도 더 빠를 것입니다. 하지만 실제로는 초당 수천 개의 쿼리를 수행하지 않는 한 (그리고 잘못 처리 한 경우 - 일종의 캐싱을 사용하십시오.) 데이터베이스를이 작업을 수행 할 이유가 있다고 생각하지 않습니다. 당신.

0
<?php 
    echo "<h3>".$this->consult['page_caption']."</h3> 

     "; 
    $txt=array(); 
    $txt = explode(" ",html_entity_decode($this->consult['page_content'])); 
    $record = array(); 
    $k =count($txt); 

    for($x=0;$x<=30;$x++){ 
     if( $x < $k){ 
      //if($txt 
      $record[] = $txt[$x]; 
     } 
    } 

    $outdata =implode(" ",$record); 
    echo "<p>".$outdata." <a href='#'> more&raquo;</a></p>"; 
    // html_entity_decode($this->consult['page_content']) 
?> 

이 또한 도움이 될 것이라고 생각합니다. 내 색인 페이지에서 기사의 기본 페이지에 대한 링크가 포함 된 콘텐츠의 일부를 가져 왔습니다.

관련 문제