【问题标题】:Knex.js : How to select columns from multiple tables?Knex.js:如何从多个表中选择列?
【发布时间】:2018-04-15 02:09:03
【问题描述】:

查询示例,

SELECT a.driverID, a.dCarID, a.dDeviceID, b.carRegiNum FROM driverProfile a, carProfile b WHERE a.dManagerID = 7 AND b.carID=a.dCarID

查询在 MySQL 上运行良好。 driverProfile 和 carProfile 是两个独立的表。 如果您需要更多说明,请发表评论。我被困在这里。

感谢您的帮助。谢谢你。

【问题讨论】:

    标签: mysql query-builder knex.js


    【解决方案1】:

    原始查询(分成行以便我们阅读[提示])

    SELECT a.driverID, a.dCarID, a.dDeviceID, b.carRegiNum 
    FROM driverProfile a, carProfile b 
    WHERE a.dManagerID = 7 AND b.carID=a.dCarID
    

    第 1 步,加入语法(修复它!)

    25 多年前,连接中的 SQL 最佳实践被重新定义,我们停止在表名之间使用逗号。 停下来...拜托! 无论如何你都不能在 Knex.js 中做到这一点....所以最好习惯它。先修复join语法:

    SELECT a.driverID, a.dCarID, a.dDeviceID, b.carRegiNum 
    FROM driverProfile a
    INNER JOIN carProfile b ON b.carID=a.dCarID
    WHERE a.dManagerID = 7
    

    第 2 步,别名(非)

    Knex 好像也不太容易做别名,所以用表名替换:

    SELECT driverProfile.driverID, driverProfile.dCarID, driverProfile.dDeviceID, carProfile.carRegiNum 
    FROM driverProfile
    INNER JOIN carProfile ON carProfile.carID=driverProfile.dCarID
    WHERE driverProfile.dManagerID = 7
    

    第 3 步,“Knexisfy”查询

    knex.select(['driverProfile.driverID', 'driverProfile.dCarID', 'driverProfile.dDeviceID', 'carProfile.carRegiNum' ])
    .from('driverProfile')
    .innerJoin('carProfile','carProfile.carID','driverProfile.dCarID')
    .where('driverProfile.dManagerID',7)
    .then(function(output){
        //Deal with the output data here 
    });
    
    1. http://knexjs.org/#Builder-select
    2. http://knexjs.org/#Builder-from
    3. http://knexjs.org/#Builder-innerJoin
    4. http://knexjs.org/#Builder-where
    5. http://knexjs.org/#Interfaces-then

    【讨论】:

    • 承认:以前从未见过 knex,所以这绝对是未经测试的
    • 它就像一个魅力。我不知道该如何感谢你。我将深入研究联接。再次感谢您。
    • 周围有大量关于连接的信息。试试这个 visual guide to joinsSQL JOIN and different types of JOINs
    • 哦,忘记表名之间的逗号,第一条规则:)
    • 这适用于特定的查询,但在更新查询中你不能做连接,如果你选择 2 个相等的表,你的查询必须是别名。
    【解决方案2】:
    SELECT 
      a.driverID, a.dCarID, a.dDeviceID, b.carRegiNum 
    FROM 
      driverProfile a, 
      carProfile b 
    WHERE 
      a.dManagerID = 7 AND b.carID=a.dCarID
    

    使用 knex 0.14.0:

    knex({ a: 'driverProfile', b: 'carProfile' })
      .select('a.driverID', 'a.dCarID', 'a.dDeviceID', 'b.carRegiNum')
      .where('a.dManagerID', 7)
      .where('b.carID', knex.raw('??', ['a.dCarID']))
    

    生成 (https://runkit.com/embed/b5wbl1e04u0v):

    select 
      `a`.`driverID`, `a`.`dCarID`, `a`.`dDeviceID`, `b`.`carRegiNum` 
    from 
      `driverProfile` as `a`, `carProfile` as `b` 
    where 
      `a`.`dManagerID` = ? and `b`.`carID` = `a`.`dCarID`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多