如何在选择查询中用数据填充外键字段,而不仅仅是外键 id?

Posted

技术标签:

【中文标题】如何在选择查询中用数据填充外键字段,而不仅仅是外键 id?【英文标题】:How do I populate a foreign key field with data instead of just foreign key id on select query? 【发布时间】:2019-05-05 15:02:54 【问题描述】:

我有 2 张桌子,上面有班级和科目。

班级(id,name,student_count) 主题(id,name,class_id)

我想在 select 查询中使用 name、student_count 和 id 填充 class_id。如何使用 SQL 或 Knex 执行此操作?

我尝试使用 join,但我只得到一个字段,而不是一行中的所有字段。

预期的结果是:

subject
   name: "data"
   id: "data"
   class: 
     id: "data"
     name: "data"
     student_count: "data"
  

顺便说一句,用 Knex 或普通 SQL 回答会有所帮助!

【问题讨论】:

您是否在 SQL 中寻找“字符串连接”选项? 不是字符串连接。就像在引用行中用实际数据填充外键字段 请提供一些示例和预期的输出数据。 【参考方案1】:

您必须使用内连接或左连接。

在 SQL 中它看起来像这样:

SELECT
      s.id            AS subject_id
    , s.name          AS subject_name
    , c.id            AS class_id
    , c.name          AS class_name
    , c.student_count AS class_student_count
FROM subjects s
INNER JOIN class ON s.class_id = c.id
WHERE s.id = 1

在 Knex 中,它看起来像这样:

getOne: () => knex
    .select(   's.id AS subject_id'
             , 's.name AS subject_name'
             , 'c.id AS class_id'
             , 'c.name AS class_name'
             , 'c.student_count AS class_student_count'
           )
    .from('subjects AS s')
    .innerJoin('class AS c', 's.class_id', 'c.id')
    .where('s.id': 1)

您将获得一个对象,其中包含 AS 之后的变量名称作为字段名称。要将其转换为您想要的格式,您必须创建一个映射器函数:

function mapToWantedFormat(subject) 
  return 
    name: subject.subject_name,
    id: subject.subject_id
    class: 
      id: subject.class_id,
      name: subject.class_name,
      student_count: subject.class_student_count
    
  ;
;

例如,它是这样使用的:

module.exports.getOne = async (req, res, next) => 
  try 
    const subject = await getOne();
    if (subject) 
      res.status(200).json(mapToWantedFormat(subject));
     else 
      res.status(404).json();
    
   catch (error) 
    next(error);
  
;

【讨论】:

以上是关于如何在选择查询中用数据填充外键字段,而不仅仅是外键 id?的主要内容,如果未能解决你的问题,请参考以下文章

访问:具有 2 个主键字段的可更新连接查询,这两个主键字段也是外键

数据库 两表互为外键,如何添加数据

如何检索一组对象,按其他对象的字段过滤和排序,所需对象是外键?

MySQL — 关联

mysql外键

如何用jdbc在swing中用另一个字段替换外键?