请原谅这个糟糕的头衔 - 不知道如何以简短的方式说出我想要做的事情。
我正在为具有本地化的现有数据库的应用创建新UI。可以有任意数量的语言,管理员可以随时创建,编辑或删除它们。 DB正在被其他应用程序使用,我无法修改结构。
数据库管理一系列艺术品。有几个“资产”表,例如media
和pieces
(以及其他表,但这些应该足以作为示例)。
每个资产表都有一个名为localization
的字段。这基本上是唯一标识符,并且是同名表(localizations
)的FK。为简单起见,假设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'的东西)。此外,添加任何类型的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
答案 0 :(得分: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
将为NULL。