2013-12-15 62 views
1

我只是想要一個SQL語句爲GROUP BY,但我希望它嘗試選擇一行,如果該行可用。我如何分組和「喜歡」一行​​

例如,我有這樣的說法:

SELECT * 
FROM `translations` 
WHERE `lang` = "pl" OR `lang` = "en" 
GROUP BY `key` 

在此聲明,我想選擇所有在langpl,並且只得到en的結果,如果沒有爲相當於pl沒有結果行。

key是多個lang是相同的列。

但是,如果我運行上述語句,所有結果將在langen的位置,並且我明白爲什麼這是但它不是我想要的行爲,我不確定如何調整它。

我知道如何以編程方式做到這一點,然而認爲它會更適合SQL。

+0

你說的'GROUP BY'是什麼意思? – Strawberry

+0

添加一個HAVING lang = pl – Mihai

+0

我會以不同的方式構建它,在lang爲'en'的主表和可能匹配lang在'pl'的輔助表之間做一個COALESCE。 – nrathaus

回答

1

你可以這句話作爲union all聲明。我的假設是,keylang對唯一標識一行(否則,您仍然可以執行group by爲每個鍵獲取一行)。

這個想法是選擇lang = 'pl'的所有行。然後選擇行,其中lang = 'en'沒有對應一行'pl'對於同一個密鑰:

SELECT * 
FROM translations 
WHERE lang = 'pl' 
union all 
SELECT * 
FROM translations 
WHERE lang = 'en' and 
     `key` not in (select `key` from translations where lang = 'pl') 
+0

謝謝,這看起來很合適! –

0

不是最佳的,但它應該得到期望的結果:

SELECT a.* 
FROM 
(
SELECT * FROM `translations` where `lang` = "pl" 
UNION ALL 
SELECT * FROM `translations` a where `lang` = "en" 
WHERE NOT EXISTS (SELECT NULL FROM `translations` b WHERE b.lang="pl") 
)a GROUP BY `key` 
0

我會做這樣的:

SELECT COALESCE(`translation_foreign`.`value`, `translations`.`value`) AS `value` 
FROM `translations` 
LEFT JOIN `translation` as `translations_foreign` ON 
      translations_foreign.key = translations.key AND 
      translations_foreign.lang = "pl" 
WHERE lang = "en" 
GROUP BY `translations`.`key`