Встроенный Select запрос на xpdo

Как составить такой sql запрос на xpdo?
SELECT 
BdOne.id_user, BdOne.date, BdOne.code, BdOne.serial, 
(SELECT `serial2` FROM `modx_serials` AS Serials WHERE Serials.serial = BdOne.serial) AS serial2,
(SELECT `code` FROM `modx_codes` AS Codes WHERE Codes.code = BdOne.code) AS code

FROM `modxrdb_codes2` AS `BdOne`
Алексей Соин
09 октября 2017, 10:58
modx.pro
1 351
0
Поблагодарить автора Отправить деньги

Комментарии: 5

Илья Уткин
10 октября 2017, 10:00
0
Этот запрос вообще неправильно составлен. Для таких случаев надо пользоваться JOIN, а не подзапросами. Перепишите запрос на JOIN и тогда по существующим в сети примерам можно будет легко составить запрос на xPDO.
    Алексей Соин
    10 октября 2017, 10:04
    0
    он изначально был на JOIN написан, раньше всё работало нормально, но сейчас в BdOne 2 000 записей, в modx_serials 150 000 записей, а в modx_codes 20 000 записей и запрос не успевает отработать за 60 секунд, а с таким запросом который я привёл выше отрабатывается за 0.1 секунды
      Илья Уткин
      10 октября 2017, 10:12
      0
      Может, нет индексов по полям serial и code в таблицах? Ну попробуйте сделать 3 отдельных запроса — сначала получить BdOne, а потом Serials и Codes. Вдруг, так будет лучше…
        Алексей Соин
        10 октября 2017, 12:21
        0
        Да, спасибо, небыло индексов, сейчас с тем кодом где джойны уже быстро отрабатывает =)
      Алексей Соин
      10 октября 2017, 10:05
      0
      вот так выглядит запрос
      $q = $modx->newQuery('BdOne');
      $q->leftJoin('Serials','Serials', 'BdOne.serial=Serials.serial');
      $q->leftJoin('Codes', 'Codes', 'BdOne.code=Codes.code');
      $q->select('BdOne.id_user,BdOne.date,BdOne.code,BdOne.serial,Serials.serial2,Codes.code');
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5