2013-12-14 4 views
0

난 레일 응용 프로그램이 있습니다. 이 응용 프로그램에서는 i18n에 globalize3 모듈을 사용합니다. 나는 locale, descriptiontitle이있는 테이블 newsnews_translations을 가지고 있습니다. 나는 조인 문장을 사용하여 현재 로케일을 검사하는 모든 뉴스를 얻는다. 현재 로케일에서 올바른 작업입니다. 예 :Postgres의 우선 순위 선택문

WHERE "news_tranlations"."locale" = 'it' 

하지만 다른 논리를 만들고 싶습니다. 예를 들어 사용자가 'de' 인 경우, 로케일 'de'으로 모든 뉴스를 표시하고 'de'이 아닌 모든 뉴스는 'en'입니다. 내가 OR 성명서와 함께 해보려고하면 'de''en'의 두 가지 번역본이 나온다. 우선 순위와 같은 것을 사용하여 정확하게 할 수 있습니까?

+1

이러한 질문은 원하는 결과와 함께 테이블과 현재 쿼리를 보여주는 sqlfiddle을 제공하면 훨씬 쉽게 해결할 수 있습니다. – gwaigh

답변

1

심각하게 고려 Denis의 성능 및 스키마 변경에 대한 의견. 그러나 다음은 사용자의 문제를 해결하고 weighted_tables가 너무 커지지 않도록 할 수있는 경우 적용 할 수 있습니다. 특히 Common Table Expressions (WITH 테이블이 생성 됨)에는 인덱스가 없습니다.

SQL Fiddle

1

어색한 질문입니다. 즉, 가능한 행을 OR 한 다음 case when locale = 'it' then 1 when ... end으로 정렬 된 하위 결과 집합의 맨 위 행을 계산해야합니다. 정확한 결과 (특히 윈도우 기능)를 얻는 데는 여러 가지 방법이 있지만 사실 솔직히 말해서 performace 이유로 거기에 가고 싶지 않습니다.

Methinks는 가정을 다시 검토하거나 스키마를 변경합니다.

합리적으로 빠른 방법 중 하나는 뉴스 항목에 배열 열을 추가하는 것입니다. languages, 이는 트리거에 의해 유지됩니다. 번역에 대한 조인 대신에 가장 많이 사용하는 뉴스 (필자가 추측하는 것으로 가정)를 필터링하십시오. (참고 : Postgres 버전에 따라 && 연산자의 선택도가 하드 코딩되어 특정 열 이외의 b 트리를 사용하여/limit/offset을 기준으로 한 주문보다 높을 수 있으므로 해당 열에 GIST 색인을 추가하지 마십시오.)

합리적으로 빨리 만드는 또 다른 방법은 언어별로 별도의 피드 테이블을 추적하는 것입니다. 기본적으로 빌드하려는 쿼리의 ID를 산출하는 구체화 된보기입니다.

두 가지 옵션 중 하나는 각 언어에 대해 표시 될 행을 부분적으로 또는 완전히 사전 계산하는 것입니다. 배열 열을 사용하는 첫 번째 방법은 내 경험에 따라 정상적으로 작동합니다. 태그를 사용하여 속도를 높이거나 필터를 사용하는 것을 좋아합니다.

1

당신은 그것을 속여 DISTINCT와 ORDER BY를 사용할 수 있습니다.

내가 뉴스에 대한 기본 및 외래 키가 무엇인지 알고 있지만, 그것을 가정하는 것은 당신이 그런 식으로 할 수있는 'news_id'입니다하지 않습니다

SELECT 
    DISTINCT ON (n.news_id), 
    n.news_id, 
    nt.title, 
    nt.description 
FROM 
    news n INNER JOIN news_translation nt 
ON 
    n.news_id = nt.news_id 
ORDER BY 
    n.news_id, 
    nt.locale != 'de', 
    nt.locale != 'en', 
    nt.locale; 

는 그 쿼리가 항상 한 번 당신에게 뉴스 기사를 반환됩니다 (중복이 없거나 여러 번역이없는 경우) 'de'번역 (존재하는 경우)을 제공하고, 'en'에 속하지 않으면 마지막으로 둘 다 존재하지 않으면 찾은 첫 번째 번역을 제공합니다 '로케일'로 주문.

+0

'오류 : UNION/INTERSECT/EXCEPT ORDER BY 절이 잘못되었습니다. LINE 191 : locale!= 'de'''ORDER BY '문에 오류가 발생합니다. – itdxer