【发布时间】:2020-01-22 18:57:05
【问题描述】:
我有两张桌子,metadata 和 view_events。 metadata 和 view_events 都有 config_id 和 config_type 列。我正在尝试为给定的用户电子邮件选择所有view_events,由config_id 和config_type 区分,由timestamp, desc 排序,并且仅限于最近的10 个。以下 knex.js 代码不起作用,但希望能表达我想要实现的目标:
return dbClient<AuthenticatedUserIndexRow>(METADATA_TABLE_NAME)
.select([
`${METADATA_TABLE_NAME}.${METADATA_COLUMNS.CONFIG_ID}`,
`${METADATA_TABLE_NAME}.${METADATA_COLUMNS.CONFIG_TYPE}`,
`${METADATA_TABLE_NAME}.${METADATA_COLUMNS.DESCRIPTION}`,
`${VIEW_EVENTS_TABLE_NAME}.${VIEW_EVENTS_COLUMNS.TIMESTAMP}`,
])
.innerJoin<AuthenticatedUserIndexRow>(VIEW_EVENTS_TABLE_NAME, function innerJoinOnViewEvents() {
this.on(
`${METADATA_TABLE_NAME}.${METADATA_COLUMNS.STORAGE_ID}`,
'=',
`${VIEW_EVENTS_TABLE_NAME}.${VIEW_EVENTS_COLUMNS.CONFIG_STORAGE_ID}`,
)
.andOn(
`${VIEW_EVENTS_TABLE_NAME}.${VIEW_EVENTS_COLUMNS.USER_EMAIL}`,
'=',
rawSql('?', [authUserEmail]),
)
.andOn(`${METADATA_TABLE_NAME}.${METADATA_COLUMNS.DELETED}`, '=', rawSql('?', [false]));
})
.distinct([
`${METADATA_TABLE_NAME}.${METADATA_COLUMNS.CONFIG_TYPE}`,
`${METADATA_TABLE_NAME}.${METADATA_COLUMNS.CONFIG_ID}`,
])
.limit(EVENT_LIMIT)
.orderBy(VIEW_EVENTS_COLUMNS.TIMESTAMP, 'desc');
例如,给定以下表格:
view_events
+-------------+-----------+--------------------------+----------------------+
| config_type | config_id | timestamp | email |
+-------------+-----------+--------------------------+----------------------+
| a | foo | 2020-01-23T03:08:14.618Z | john.smith@gmail.com |
| a | foo | 2020-01-23T03:08:14.500Z | jane.doe@gmail.com |
| a | foo | 2020-01-23T03:08:13.618Z | john.smith@gmail.com |
| a | bar | 2020-01-23T03:08:12.618Z | john.smith@gmail.com |
| a | foo | 2020-01-23T03:08:11.618Z | john.smith@gmail.com |
| b | foo | 2020-01-23T03:08:10.618Z | john.smith@gmail.com |
| a | baz | 2020-01-23T03:08:09.618Z | john.smith@gmail.com |
| a | foo | 2020-01-23T03:08:08.618Z | john.smith@gmail.com |
+-------------+-----------+--------------------------+----------------------+
metadata
+-------------+-----------+---------------------------+
| config_type | config_id | description |
+-------------+-----------+---------------------------+
| a | foo | Type a config with id foo |
| a | bar | Type a config with id bar |
| b | foo | Type b config with id foo |
| a | baz | Type a config with id baz |
+-------------+-----------+---------------------------+
我正在尝试获取以下输出(给定 authUserEmail 的 john.smith@gmail.com):
+-------------+-----------+---------------------------+
| config_type | config_id | description |
+-------------+-----------+---------------------------+
| a | foo | Type a config with id foo |
| a | bar | Type a config with id foo |
| b | foo | Type b config with id foo |
| a | baz | Type a config with id baz |
+-------------+-----------+---------------------------+
我不是 SQL 专家,但我通常知道在这里一起使用 SELECT 和 DISTINCT 是行不通的。正确的做法是什么?
【问题讨论】:
-
您的意思是您只希望每个配置 ID/类型返回一行吗?也许提供最小的输入/输出示例只是为了阐明要求?
-
正确。我会将其添加到原始问题中。
-
听起来你想要
groupBy,在这种情况下,你需要聚合选择列表中的剩余列。可能只获取最新的(最大)时间戳就可以了…… -
不完全确定我是否遵循。提供的输入/输出是否有助于澄清我的问题?
-
我想是的,会玩得很开心的......
标签: javascript sql postgresql knex.js