php - 根据查询结果的单行动态列名

标签 php mysql

我需要一些有关 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. 建筑1
  2. 构造2
  3. 构造 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;

关于php - 根据查询结果的单行动态列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20213161/

相关文章:

java - 改进mysql JDBC插入调用

c# - 自动增量不适用于模型

mysql - 如何将csv转换成数据库表

php - 没有从关联表中提取数据 : Laravel

php - 我怎样才能让这个 php 返回一个 sql db 的整个列

php - 加速 CakePHP

今天的 mySQL 行不会持续 24 小时

javascript - UAT 环境中 url 未定义的奇怪问题。在本地它正在工作 :

php - 如何获取并显示数据库中的最大值?

MySQL - 跨多个 WHERE 语句匹配 LIKE 语句中的参数