2014-06-20 1 views
1

내 질문에 직접적으로 답하는 해결책을 찾을 수 있는지 살펴 보았지만 찾을 수없는 것 같습니다.SQL 쿼리에서 처음 160자를 얻고 HTML을 제거하려면 어떻게합니까?

내 기존 DB를 쿼리하고 새 DB로 가져올 수있는 새 테이블을 만듭니다. news_releases_body에서 파생 된 news_releases_summary이라는 새 필드를 만들고 싶지만 처음 160 자 (SEO 메타 desc)와 이상적인 HTML은 없습니다.

현재 검색어는 다음과 같습니다. 문제가있는 기능은 LTRIM입니다. RTRIM -이 작업에 적합한 기능인지는 확실하지 않습니다. *이 작업을 수행하지 않으면 최종 출력물이 JSON으로 확인되지 않으므로 \ n \ t도 제거해야합니다.

SELECT 
FROM_UNIXTIME(exp_channel_titles.entry_date,'%m/%e/%Y %h:%i %p') AS entry_date, 
exp_channel_titles.status, 
exp_channel_titles.title, 
exp_channel_data.field_id_66 AS news_releases_subtitle, 
exp_channel_data.field_id_65 AS news_releases_contact, 
REPLACE(replace(exp_channel_data.field_id_67,char(10),''),char(13),'') AS news_releases_body 
LTRIM(RTRIM(REPLACE(replace(exp_channel_data.field_id_67,char(10),''),char(13),''))) AS news_releases_summary 
FROM exp_channel_data INNER JOIN exp_channel_titles 
ON exp_channel_data.entry_id = exp_channel_titles.entry_id 
WHERE exp_channel_data.channel_id = '21' 
ORDER BY exp_channel_titles.entry_date 

UPDATE

내가 지금 생각하는 곳이다, 그러나 나는 "존재하지 않는 기능의 ee_2.strip_tags"오류를 받고 있어요. strip_tags 함수를 쿼리에 직접 포함시켜야합니까? 나는 Mac에서 Sequel Pro를 사용하고 있습니다.

CREATE FUNCTION `strip_tags`($str text) RETURNS text 
BEGIN 
    DECLARE $start, $end INT DEFAULT 1; 
    LOOP 
     SET $start = LOCATE("<", $str, $start); 
     IF (!$start) THEN RETURN $str; END IF; 
     SET $end = LOCATE(">", $str, $start); 
     IF (!$end) THEN SET $end = $start; END IF; 
     SET $str = INSERT($str, $start, $end - $start + 1, ""); 
    END LOOP; 
END; 

SELECT 
FROM_UNIXTIME(exp_channel_titles.entry_date,'%m/%e/%Y %h:%i %p') AS entry_date, 
exp_channel_titles.status, 
exp_channel_titles.title, 
exp_channel_data.field_id_66 AS news_releases_subtitle, 
exp_channel_data.field_id_65 AS news_releases_contact, 
REPLACE(REPLACE(exp_channel_data.field_id_67,char(10),''),char(13),'') AS news_releases_body, 
LEFT(strip_tags(REPLACE(REPLACE(exp_channel_data.field_id_67,char(10),''),char(13),'')),160)  AS news_releases_summary 
FROM exp_channel_data INNER JOIN exp_channel_titles 
ON exp_channel_data.entry_id = exp_channel_titles.entry_id 
WHERE exp_channel_data.channel_id = '21' 
ORDER BY exp_channel_titles.entry_date 
+2

RDBMS를 사용하고 계십니까? – ninesided

+0

Mac에서 Sequel Pro를 사용하고 있습니다 –

+0

작동하지 않는 쿼리의 유일한 부분은 LTRIM –

답변

1

내포 된 replace 호출을 사용하여 원하지 않는 개행 문자를 제거 할 수 있어야합니다. questions on stack exchange that deal with this already이 있지만 char 함수를 사용하는 대신 \n\r 문자를 사용합니다.

HTML 엔티티를 스트리핑하는 경우 비즈니스를 수행하는 기능을 롤링하지 않고도 쉽게 수행 할 수 없습니다. 고맙게도 someone has done that for you as well.

마지막으로 결과에 160 자만 있으면 left 함수를 사용하여 결과를 가장 왼쪽의 160 자로 제한하십시오.

+0

감사합니다. 나는 가까워지고 있지만 분명히 내 쿼리에서 함수를 올바르게 사용하는 방법을 알지 못한다. 이 페이지에서 'strip_tags'함수를 삽입했습니다. http://stackoverflow.com/questions/2627940/remove-html-tags-from-record하지만 오류가 발생합니다. 함수 ee_2.strip_tags가 없습니다. 내 쿼리 전에 함수를 삽입하는 해요,하지만 오류 메시지를 기반으로 함수가 다른 위치에 있어야합니까? 누구든지 사용자 정의 함수가 Sequel Pro에서 어디에 있어야하는지 알고 있습니까? –

관련 문제