Сортировать MySql запрос по полю в существующем подзапросе - PullRequest
0 голосов
/ 03 июня 2019

Я ищу способ сортировки запроса по полю, которое существует в запросе, где существует.
При попытке использовать поле из подзапроса, существующего у меня появляется ошибка "Неизвестный столбец".
Примерquery;

select
    *
from
    `table_a`
where
    `a_field` = 'foo'
    and exists (
            select
                *
            from
                `table_b`
            where
                `table_a`.`an_id` = `table_b`.`another_id` and `table_b`.`another_field` = 'bar'
        )
order by
    `table_a`.`created_at` asc,
    `table_b`.`another_id` desc;

Является единственным решением, использующим запрос внутреннего соединения, подобный;

select
    `t1`.*
from
    `table_a` as `t1`
    inner join `table_2` as `t2` on `t2`.`another_id` = `t1`.`an_id`
where
    `t1`.`a_field` = 'foo'
    and `t2`.`another_field` = 'bar'
order by
    `t1`.`created_at` asc,
    `t2`.`another_id` desc;

1 Ответ

0 голосов
/ 03 июня 2019

Ваш пример запроса упорядочен по another_id, что используется в предложении корреляции. Итак, вы можете просто сделать:

select a.*
from table_a a
where a.a_field = 'foo' and
      exists (select 1
              from table_b b
              where a.an_id = b.another_id and
                    b.another_field = 'bar'
             )
order by a.created_at asc,
         a.an_id desc;

Предполагая, что вы действительно хотите другой столбец , вы можете использовать JOIN. Проблема в том, что может совпадать несколько строк. Так что вам нужно удалить дубликаты в подзапросе:

select a.*
from table_a a join
     (select b.another_id, max(b.another_col) as another_col
      from table_b b
      where another_field = 'bar'
      group by b.another_id
     ) b
     on a.an_id = b.another_id
where a.a_field = 'foo'
order by a.created_at asc, b.another_id desc;

Вы можете использовать свою форму JOIN, только если знаете, что будет соответствовать не более одной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...