postgresql Knex -获取拥有X或Y设备但没有Z设备的用户

hec6srdp  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(117)

我想获取拥有X或Y设备的用户,但排除拥有Z设备的所有用户。
| 用户标识|设备类型|资源类型|
| - -|- -|- -|
| 一百二十三|X轴|器械|
| 一百二十三|Y型|器械|
| 三百二十一|Y型|器械|
| 三百二十一|Z轴|器械|
| 二百三十一|Y型|器械|
| 三百三十三|Q值|其他|
因此,所需的返回值将是ID为123和231的用户,不包括321和333,无论他们有多少台设备,每个用户都返回一次。
我可以设法返回具有X或Y设备的设备,但无法设法排除具有Z设备的设备。下面是我对XY的调用(原始文件有几列):

knex
.select('user_id')
.groupBy('user_id')
.where('resource_type', 'Device')
.andWhere(function() {
this.where('device_type', 'X').orWhere('device_type', 'Y')
})

我试着把它和其他where子句混合在一起,比如whereNot和其他子句,但是没有成功,使用设备Z的用户仍然出现,就好像这个子句被忽略了一样。有人能给我指出正确的方向吗?非常感谢。

az31mfrm

az31mfrm1#

像这样的东西应该能用

// First you create a subquery that will select the users with devices different from X and Y
const subquery = knex
  .select('user_id')
  .groupBy('user_id')
  .where('resource_type', 'Device')
  // Search users without X or Y device_type
  .whereNotIn('device_type', ['X', 'Y']);

// And then you search the users with device_type in X and Y, but not in the subquery
knex
  .select('user_id')
  .groupBy('user_id')
  .where('resource_type', 'Device')
  // Search users with X or Y device_type
  .whereIn('device_type', ['X', 'Y'])
  // Remove users that have at least a device different of X AND Y (those in the subquery)
  .whereNotIn('user_id', subquery);

相关问题