2012-07-20 22 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使用哪一行的加入,那麼一切都會沒事的。

如果存在多個匹配行,是否有方法可以定義連接中使用哪個行?

編輯:產品可以有任何語言的名稱,並不是所有的產品都有英文名稱,對於混淆抱歉。

編輯2:我發現了一個等價的問題:MySQL JOIN the most recent row only? 在那裏,SQL-gurus也使用子選擇(我的子選擇查詢非常緩慢,所以我想避免它),所以也許SQL不能做我想做的:-(

+0

如何定義最佳可用名稱? – 2012-07-21 12:29:49

回答

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 2012-07-20 18:18:12

+0

並非所有產品都有英文名稱,每種產品也可能有多個英文名稱。 (真正的表格有點複雜,還有優先級列,別名標誌等。) - 基本上我想要做的不僅僅是加入一個特定的條件(LEFT JOIN ON bla = ble AND blo <> blu),而是要使用適合該條件的最佳可用條件。 – Robby75 2012-07-21 06:33:35

0

您定義查詢的方式並未出現,您需要加入產品表。

如果name_table包含產品欄,語言欄和想要獲取的名稱,那麼爲什麼還要加入product_table?請澄清一下,我想我可能會知道你需要做什麼,但是這個問題對我來說是混亂的。

+0

同意。我認爲混亂的部分原因是所有產品至少有英文名稱。 – shawnt00 2012-07-20 18:20:28

+0

對不起:產品沒有英文名稱,一個英文名稱或幾個英文名稱,完全是任意的。基本上我試圖做的是選擇最好的可用名稱。 – Robby75 2012-07-21 06:34:49