簡體   English   中英

使用Knex.js的select語句的子查詢

[英]Subquery of select statement with Knex.js

我正在嘗試使用Knex使用子查詢創建以下查詢:

SELECT 
  t.*, 
  (SELECT COUNT(*) FROM team_users tu WHERE TeamID = t.ID) AS UserCount,
  (SELECT COUNT(*) FROM team_access ta WHERE TeamID = t.ID) AS AppCount
FROM teams t WHERE OwnerUserID = _UserID;

結果應該是team表,其中包含來自不同表的UserCount和AppCount的計數聚合(team_users,team_access)

id | Name      | OwnerUserID   | UserCount | AppCount
-----------------------------------------------------
134| Team A    | 1538          | 7         | 6
135| Team B    | 1538          | 4         | 2
136| Team C    | 1538          | 12        | 1

我認為是一個等效的knex實現是:

var subquery1 = Knex.knex('team_users').count('*').where('TeamID', 'teams.ID').as('UserCount');
var subquery2 = Knex.knex('team_access').count('*').where('TeamID', 'teams.ID').as('AppCount');
Knex.knex.select('*', subquery1, subquery2).from('teams').where("OwnerUserID", ownerId).asCallback(dataSetCallback);

運行它,我確實在返回的對象中得到“UserCount”和“AppCount”列但總是為零,可能是因為它沒有識別子查詢中的'teams.ID'。

我設法使用Knex.raw函數解決它:

Knex.knex('teams')
    .select('*', Knex.knex.raw('(SELECT COUNT(*) FROM team_users WHERE TeamID = teams.ID) AS UserCount'), Knex.knex.raw('(SELECT COUNT(*) FROM team_access WHERE TeamID = teams.ID) AS AppCount'))
    .where("OwnerUserID", ownerId)
    .asCallback(dataSetCallback);

但我很想知道如何使用子查詢對象實現這一點。

您正在嘗試將teams.ID字符串作為值傳遞。 為了能夠做.where('columnName', 'otherColumnName') ,必須使用knex.refotherColumnName作為標識符傳遞。

var teamsIdColumnIdentifier = knex.ref('teams.ID'); // <-- [1]

var subquery1 = Knex.knex('team_users').count('*')
  .where('TeamID', teamsIdColumnIdentifier).as('UserCount');
var subquery2 = Knex.knex('team_access').count('*')
  .where('TeamID', teamsIdColumnIdentifier).as('AppCount');

Knex.knex.select('*', subquery1, subquery2).from('teams')
  .where("OwnerUserID", ownerId).asCallback(dataSetCallback);

[1]之前knex.ref加入Knex在5月2018年 ,你不得不使用knex.raw ,像這樣;

var teamsIdColumnIdentifier = knex.raw('??', ['teams.ID']);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM