2012-08-09 47 views
0

請原諒糟糕的標題 - 不知道如何用簡短的方式來表達我想要做的事情。MySQL - 將連接行值作爲選擇字段傳遞

我正在爲具有本地化現有數據庫的應用程序開發新的UI。可以有多種語言,並且可以隨時由管理員創建,編輯或刪除它們。數據庫正在被其他應用程序使用,我無法修改結構。

該數據庫管理藝術品的集合。有幾個「資產」表,如mediapieces(和其他,但這兩個應該足以作爲例子)。

每個資產表都有一個名爲localization的字段。這基本上是一個唯一的標識符,並且是具有相同名稱的表格的FK(localizations)。爲簡單起見,假設media表看起來像這樣

id localization 
1 1 
2 2 
3 5 
4 8 
5 11 
... 

pieces表使用相同的定位增量,所以可能看起來像這樣

id localization 
1 3 
2 4 
3 6 
4 9 
5 20 
... 

localizations表僅僅是一系列的自動遞增的PK。

localization 
1 
2 
3 
4 
5 
... 

有一個localization_entries表是關係鍵:值對本地化:

localization language entry_key entry_value 
1    en  title  photo of dog 
1    en  detail  this is long text describing the photo of the dog. 
1    es  title  foto de perro 
2    en  title  photo of cat 
... 

任何特定的定位可能有沒有一個條目鍵和值,任何或所有可用的語言。

我們需要能夠使用本地化值進行搜索和排序。最初,我認爲唯一的方法是完全加載數據集(多個查詢),填充一個PHP數組對象,然後執行搜索和PHP排序,但我想知道是否可以使用直接SQL。

理想情況下,我想返回具有所有本地化條目值的行。例如,除了本地化的所有本地化值之外,第一個本地化的行還會包含媒體項目本身的所有字段。

事情是這樣的「作品」

SELECT media.id, media.name, en.entry_value as en_title, sp.entry_value as sp_title 
FROM media 
JOIN localization_entries en 
ON media.localization=en.localization 
JOIN localization_entries sp 
ON media.localization=sp.localization 
AND en.language='en' AND en.entry_key = 'title' 
AND sp.language='es' AND sp.entry_key = 'title' 

但很明顯,任何不具備相應的鍵或語言的一個entry_key不予退還(例如,什麼沒有「上課」的'entry_key標題')。此外,加入任何形式的WHEREORDER BY條款失效,以及...

SELECT media.id, media.name, en.entry_value AS en_title, sp.entry_value AS sp_title 
FROM media 
JOIN localization_entries en 
ON media.localization=en.localization 
JOIN localization_entries sp 
ON media.localization=sp.localization 
AND en.language='en' AND en.entry_key = 'title' 
AND sp.language='es' AND sp.entry_key = 'title' 
WHERE en.entry_value like '%whatever%' -- would not work 
ORDER BY en.entry_value 

有搜索使用MySQL一組這樣的關係/排序/篩選的實用方法?

TYIA

回答

2

使用外連接:

SELECT media.id, media.name, en.entry_value as en_title, sp.entry_value as sp_title 
FROM media 
LEFT OUTER JOIN localization_entries en 
ON media.localization=en.localization AND en.language='en' AND en.entry_key = 'title' 
LEFT OUTER JOIN localization_entries sp 
ON media.localization=sp.localization AND sp.language='es' AND sp.entry_key = 'title' 

你會得到NULL的en_titlesp_title如果沒有匹配的行localization_entries

+0

真棒..我得看看你是怎麼做到的。謝謝 – momo 2012-08-09 23:54:26