2012-07-20 5 views
0

제품이있는 테이블과 이들 제품의 이름을 가진 테이블이 있습니다 (제품마다 다른 언어로 여러 이름이있을 수 있음). 다음 국제 이름 하나가있는 경우이 모든 이름의 목록과 영어 가능한 최상의 이름을 (얻을 것조인에 사용할 행을 정의하십시오.

SELECT name 
FROM name_table 
LEFT JOIN product_table ON name_table.product = product_table.product 
ORDER BY name_table.product, language != 'en', language != '*' 

:

나는 현재 모든 제품의 이름을 나열하기 위해이 같은 쿼리를 사용 , 어느 쪽도 존재하지 않으면 어떤 이름이라도) 항상 첫번째로 나타날 것입니다. 각 제품에 대한 첫 번째 항목 이후에 모든 항목을 건너 뛰기 만하면됩니다. 우아하지는 않지만 충분히 빠르게 작동합니다.

이 문제는 알파벳순으로 정렬 할 수 없다는 것입니다. 그러나

, 내가 이런 걸 사용

SELECT 
    product, 
(SELECT name 
    FROM name_table 
    WHERE name_table.product = product_table.product 
    ORDER BY language != 'en' 
    LIMIT 1) AS bestname 
FROM product_table 
ORDER BY bestname 

다음 쿼리가 너무 느립니다 (적어도 MySQL을로)을.

사용되는 어떤 이름 행 (그러므로 준 랜덤)이 쿼리는 빠른하지만 정의되지 않은 것 같다 :

SELECT name 
FROM product_table 
LEFT JOIN name_table ON name_table.product = product_table.product 
ORDER BY name 

나는 단지 가입에 사용할 것을 행 MySQL을 말할 수 있다면, 모든 것 좋아.

일치하는 여러 행이있는 경우 조인에 어떤 행이 사용되는지 정의 할 수 있습니까?

편집 : 제품은 모든 언어로 된 이름을 가질 수 있으며 모든 제품에 영어 이름이있는 것은 아닙니다. 혼란스러워서 죄송합니다.

Edit2가 :이 MySQL JOIN the most recent row only? 도 (내 부속 쿼리가 너무 느립니다 그래서 그것을 피하려고) 하위 선택을 사용하는 SQL-전문가, 그래서 아마 SQL 내가 원하는 것을 할 수 없습니다 나는 동등한 질문을 발견했다 :-(

+0

가장 적합한 이름을 어떻게 정의합니까? –

답변

1

당신이이 질문이 시사하는 제품에 대한 바로 영어 이름을 얻으려고 노력 있습니까?

SELECT name 
FROM name_table LEFT JOIN 
    product_table ON name_table.product = product_table.product 
where language = 'en' 
ORDER BY name_table.product 

을 또는 당신이 외국 이름을 얻으려고 노력하고 있지만 영어로 제품을 주문 이름이 필요하면 추가 가입이 필요합니다.

SELECT name 
FROM name_table LEFT JOIN 
    product_table 
    ON name_table.product = product_table.product and 
     name_table.language <> 'en' left outer join 
    product_table pten 
    on name_table.product = product_table.product and 
     name_table.language = 'en' 
ORDER BY pten.name, name_table.product_id 

여기에는 제품에 대해 하나의 영문 이름 만 있다고 가정합니다. 정렬의 두 번째 절은 다른 모든 이름을 함께 유지하기 위해 영어 이름이없는 경우입니다.

+0

제 생각에 첫 번째 쿼리의 조인 조건에도'language = 'en'' 필터를 포함시키고 싶습니다. – shawnt00

+0

일부 제품에는 영어 이름이 없으며 각 제품에는 영어 이름이 여러 개있을 수 있습니다. (실제 테이블은 좀 더 복잡하고 priority-column, alias-flag 등도있다.) - 기본적으로 특정 조건 (LEFT JOIN ON bla = ble AND blo <> blu)뿐만 아니라 해당 조건에 가장 적합한 사용 가능한 조건을 결합하는 것입니다. – Robby75

0

검색어를 정의한 방식에 따라 제품 테이블에 전혀 가입하지 않아도됩니다.

name_table에 제품 열, 언어 열, 그리고 얻으려는 이름이있는 경우 왜 product_table에 대한 가입이 있습니까? 명확히 말하자면, 내가해야 할 일을 알고 있을지 모르지만, 그 질문은 나에게 혼란스럽게 표현됩니다.

+0

동의. 혼란의 일부는 모든 제품에 적어도 영어 이름이 있는지 여부입니다. – shawnt00

+0

죄송합니다. 제품에는 영어 이름이 없거나 영어 이름 하나 또는 여러 영어 이름이있을 수 있습니다. 이는 완전히 임의적입니다. 기본적으로 내가하려는 것은 최선의 사용 가능한 이름을 선택하는 것입니다. – Robby75

관련 문제