MySQL - 将连接的行值作为选择字段传递

时间:2012-08-09 23:22:31

标签: mysql

请原谅这个糟糕的头衔 - 不知道如何以简短的方式说出我想要做的事情。

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

数据库管理一系列艺术品。有几个“资产”表,例如mediapieces(以及其他表,但这些应该足以作为示例)。

每个资产表都有一个名为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'的东西)。此外,添加任何类型的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

1 个答案:

答案 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_titlelocalization_entries将为NULL。