我需要一些关于sql查询中动态列名的帮助。首先,我将尝试解释我的数据库结构,然后是问题所在。
数据库结构:
admin_group表:
+--------+----------------+
| id | language_code |
+--------+----------------+
| 1 | en_UK |
| 2 | de_DE |
| 3 | es_ES |
+--------+----------------+
constructions_meta表:
+--------+-----------------+----------+
| id | admin_group_FK | value |
+--------+-----------------+----------+
| 1 | 1 | 0.13 |
| 2 | 2 | 0.12 |
| 3 | 3 | 0.10 |
+--------+-----------------+----------+
construction_lang表:
+--------+-----------------+----------------+----------------+
| id | en_UK_name | de_DE_name |es_ES_name |
+--------+-----------------+----------------+----------------+
| 1 | Construction 1 | Konstruktion 1 | Construcción 1 |
| 2 | Construction 2 | Konstruktion 2 | Construcción 2 |
| 3 | Construction 3 | Konstruktion 3 | Construcción 3 |
+--------+-----------------+----------------+----------------+
这些是我在数据库中的表。这里我需要的是得到关于每个构造的语言代码的构造的名称。例如,我想列出以下结构:
- 构造1
- 结构2
- Construcción 3
select c.id , (select case c.admin_group_FK
when 1 then l.en_UK_name
when 2 then l.de_DE_name
else l.es_ES_name
end from construction_lang l where id = c.id) as construction_name,
c.value
from constructions_meta c;
是的,解决方案只是让你快速工作。Rob关于改进数据模型是正确的
解决方案是:
您需要从数据模型中删除construction_lang表,并用这个关联表替换它,就像Rob提出的一样
+------------------+--------------+----------------+
| construction_fk | language_fk | name |
+------------------+--------------+----------------+
| 1 | 1 | Construction 1 |
| 1 | 2 | Konstruktion 1 |
| 1 | 3 | Construcción 1 |
| 2 | 1 | Construction 2 |
| 2 | 2 | Konstruktion 2 |
| 2 | 3 | Construcción 2 |
| 3 | 1 | Construction 3 |
| 3 | 2 | Konstruktion 3 |
| 3 | 3 | Construcción 3 |
+------------------+--------------+----------------+
那么您需要的查询是
select c.id, l.language_code , a.name ,c.value
from constructions_meta c
join construction_lang_assoc a on a.construction_fk = c.id and a.language_fk = c.admin_group_FK
join admin_group l on l.id = c.admin_group_FK;
这可能是最简单的两次通过。这将使您能够在不显著影响SQL语句的情况下扩展construction_lang表的宽度。
首先,您发布一条SQL语句来获取所需的列名,然后使用该结果集构建第二条SQL语句,该语句将为您获取列名
这不是理想的解决方案,因为它围绕数据模型工作。
给定一个查询,该查询从admin_group返回id和语言,如下所示:
array( array( 'id' => 1, 'language_code' => 'en_UK' ),
array( 'id' => 2, 'language_code' => 'de_DE' ),
array( 'id' => 3, 'language_code' => 'es_ES' ) )
您可以使用类似(以diarmuid中的另一个答案为例)的内容构建一个语句
$sql = "select c.id , (select case c.admin_group_FK'r'n";
foreach( $languages as $thisLanguage ) {
$sql .= "when {$thisLanguage['id']} then l.${thisLanguage['language_code']}_name'r'n";
}
$sql .= ...
由于您拥有的数据模型,这是一种全面的方法。理想情况下,您不需要"动态"SQL。"
如果你想去掉round-of-ness,构建更符合标准关系数据库理论的东西,那么你可以更改模型,使construction_lang表更像这样:
+------------------------+-----------------+----------------+
| constructions_meta_fk | language | name |
+------------------------+-----------------+----------------+
| 1 | en_UK | Construction 1 |
| 1 | de_DE | Konstruktion 1 |
| 1 | es_ES | Construcción 1 |
| 2 | en_UK | Construction 2 |
| 2 | de_DE | Konstruktion 2 |
| 2 | es_ES | Construcción 2 |
| 3 | en_UK | Construction 3 |
| 3 | de_DE | Konstruktion 3 |
| 3 | es_ES | Construcción 3 |
+------------------------+-----------------+----------------+
如果条件类似`
if(admin_group_FK == 1)
{
fetch['en_UK_name'];
}
if(admin_group_FK == 2)
{
fetch['de_DE_name'];
}
if(admin_group_FK == 3)
{
fetch['es_ES_name'];
}
`