請原諒糟糕的標題 - 不知道如何用簡短的方式來表達我想要做的事情。MySQL - 將連接行值作爲選擇字段傳遞
我正在爲具有本地化現有數據庫的應用程序開發新的UI。可以有多種語言,並且可以隨時由管理員創建,編輯或刪除它們。數據庫正在被其他應用程序使用,我無法修改結構。
該數據庫管理藝術品的集合。有幾個「資產」表,如media
和pieces
(和其他,但這兩個應該足以作爲例子)。
每個資產表都有一個名爲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標題')。此外,加入任何形式的WHERE
或ORDER 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
真棒..我得看看你是怎麼做到的。謝謝 – momo 2012-08-09 23:54:26