0

请原谅这个糟糕的标题 - 不知道如何用简短、简单的方式表达我想要做的事情。

我正在为具有已本地化的现有数据库的应用程序开发新 UI。可以有任意数量的语言,管理员可以随时创建、编辑或删除它们。数据库正在被其他应用程序使用,我无法修改结构。

DB 管理着一系列艺术品。有几个“资产”表,例如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 的东西都不会被返回(例如,任何没有 'es' entry_key 的 'title' 的东西)。此外,添加任何类型的WHEREorORDER 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

4

1 回答 1

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'

如果. en_title_ sp_title_localization_entries

于 2012-08-09T23:45:17.347 回答