【问题标题】:get value by matching the header column name with row value in another table通过将标题列名称与另一个表中的行值匹配来获取值
【发布时间】:2019-12-25 17:19:03
【问题描述】:

我们的客户要求为每个客户安排来自数据库的字段以外的列。当客户登录时,他们将能够根据他们的要求查看列和值。因此,我们希望将列名与另一个表中的行值(存储为列名)进行比较,并在单个数组中获取这些值。

假设我有 2 张桌子。

表 A 是所有数据输入的地方

Table A
id    | job_no    | applied_date    | customer_id    |
------|-----------|-----------------|------------    |
1     | BOM/001   | 2019-06-18      | 1              |
2     | BOM/002   | 2019-08-16      | 1              |

表 B 是存储自定义字段排列的地方

Table B
column_id    | field_name    | sort_order    | customer_id    |
-------------|---------------|---------------|----------------|
1            | job_no        | 1             | 1              |
2            | applied_date  | 2             | 1              |

客户将看到的最终结果是

Final Result
job_no    | applied_date    |
----------|-----------------|
BOM/001   | 2019-06-18      |
BOM/002   | 2019-08-16      |

我们尝试过的查询如下,但由于限制为 1,因此返回 1 个值

mysql

SELECT column_id
     , customer_id
     , field_name
     , sort_order
     , (SELECT CASE c.field_name WHEN 'job_no' 
                                 THEN d.job_no 
                                 WHEN 'applied_date' 
                                 THEN d.applied_date 
                                 ELSE 0 END 
          FROM table_a d 
         WHERE d.customer_id = c.customer_id LIMIT 1) AS value 
  FROM table_b c 
 WHERE c.customer_id = 1 
 ORDER 
    BY sort_order ASC");

预期的输出应为如上所示的最终结果。希望,我能够解释你。提前谢谢你。

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为这不是问题,而是 Jira 中的任务。一个人喜欢因为这样做而获得报酬。

标签: php html mysql php-7


【解决方案1】:
DROP TABLE IF EXISTS table_a;

CREATE TABLE table_a
(id SERIAL PRIMARY KEY
,job_no VARCHAR(12) NOT NULL
,applied_date DATE NOT NULL
,customer_id INT NOT NULL
);

INSERT INTO table_a VALUES
(1,'BOM/001','2019-06-18',1),
(2,'BOM/002','2019-08-16',1);

DROP TABLE IF EXISTS table_b;

CREATE TABLE table_b
(column_id SERIAL PRIMARY KEY
,field_name VARCHAR(20) NOT NULL UNIQUE
,sort_order INT NOT NULL
,customer_id INT NOT NULL
);

INSERT INTO table_b VALUES
(1,'job_no',1,1),
(2,'applied_date',2,1);

SELECT DISTINCT job_no 
              , applied_date 
           FROM table_a a 
           JOIN table_b b 
             ON b.customer_id = a.customer_id 
          ORDER 
             BY job_no;
+---------+--------------+
| job_no  | applied_date |
+---------+--------------+
| BOM/001 | 2019-06-18   |
| BOM/002 | 2019-08-16   |
+---------+--------------+

也许数据集不足以代表问题。

如果是这样,请参阅:Why should I provide an MCRE for what seems to me to be a very simple SQL query?

【讨论】:

    【解决方案2】:

    你可以用 IF 条件加入它:

    SELECT
      b.id,
      a.customer_id,
      b.field_name,
      b.sort_order,
      IF(b.field_name = 'job_no', a.job_no, a.applied_date) value
    FROM a 
    INNER JOIN
        b ON b.customer_id = a.customer_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 2022-08-19
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多