Как написать подзапрос MySQL в Knex? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь написать mysql подзапрос sql в knex, но результаты запроса нежелательны.

Это мой запрос MySQL:

    select *
    from istifta
    where istifta_id not in (
    select istifta_id
    from status
    where status = 'divided'
    )

Это мой запрос, преобразованный в Knex:

    subquery = await ctx.knex
      .select('istifta_id')
      .from('status')
      .where('status', 'divided')

    result = await ctx.knex
    .select()
    .from('istifta')
    .where('istifta_id', 'not in', subquery)

Запрос MySQL возвращает две строки, каждая из которых не имеет status = 'divided' В то время как Knex возвращает три строки со строкой, имеющей status = 'divided'

1 Ответ

0 голосов
/ 15 апреля 2019

Вы можете использовать .whereNotIn вместе с опцией определения функции () для вложения вашего подзапроса.Ваш подзапрос находится внутри функции () как:

 select('istifta_id').from('status').where('status', 'divided')

, а функции .on лишь упрощают отладку.

result = await ctx.knex.from('istifta')
    .whereNotIn( 'istifta_id', function() {
        this.select('istifta_id').from('status').where('status', 'divided')
    })
    .on('query', function(data) { 
        console.log("TEST001 data:", data); })
    .on('query-error', function(ex, obj) {
        console.error("TEST002 KNEX query-error ex:", ex, "obj:", obj);
    })
...