Подготовка столбца, который выбирается подзапросом - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть следующий запрос

select distinct `orders`.`id`, `order_status`,
(SELECT `setting_id` FROM `settings` WHERE `settings`.`order_id` = `orders`.`id`) AS `setting_id`,
from `orders` order by orders.id desc limit 100 OFFSET 0

, который работает просто отлично, столбец "setting_id" выбирается как следует, но когда я добавляю еще один WHERE

and `setting_id` = 2

, он не может найти его и вывести Unknown column 'setting_id' in 'where clause'. Почему?

1 Ответ

2 голосов
/ 29 апреля 2020

Я бы изменил ваш запрос на столбец JOIN vs selection. Медленнее, поскольку он должен выполнять выбор столбца каждый раз. Теперь, если вы хотите только для setting_id = 2, просто добавьте часть JOIN условия

select distinct 
      o.id, 
      o.order_status,
      s.setting_id
   from 
      orders o
         join settings s
            on o.id = s.order_id
            AND s.setting_id = 2
   order by
      orders.id desc 
   limit 
      100 OFFSET 0

(это также не удавалось, потому что у вас была лишняя запятая после столбца выбора настроек). Вы также могли бы отменить объединение, начав с таблицы настроек, чтобы вас интересовали только те, у кого статус 2, а затем находили ордера. Я бы позаботился о том, чтобы в вашей таблице настроек был индекс (setting_id, order_id) для оптимизации запроса.

select distinct 
      s.order_id id, 
      o.order_status,
      s.setting_id
   from 
      settings s
         JOIN orders o
            on s.order_id = o.id
   where
      s.setting_id = 2
   order by
      s.order_id desc 
   limit 
      100 OFFSET 0

При правильном указателе, как указано выше, приведенное выше должно быть молниеносно непосредственно из индекса

Еще одно соображение для кажущейся большой таблицы: ограничить количество дней назад, когда вы запрашиваете заказы, лимитом 100. Go назад 1 месяц? 2? 15 дней? Насколько велика таблица ваших заказов, чтобы она тянулась в течение 10 секунд. Это может быть лучшим выбором для вас.

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