我需要有关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 |
+--------+-----------------+----------------+----------------+
这些是我在数据库中的表。我在这里需要获取有关每个结构的语言代码的结构名称。例如,我想列出以下结构:
两遍操作可能最容易做到。这将使您能够扩展construction_lang表的宽度,而不会显着影响SQL语句。
首先,您发出一条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。
如果您想消除回旋现象,并根据标准关系数据库理论构建更多内容,则可以更改模型,以使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 |
+------------------------+-----------------+----------------+
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句