LINUX.ORG.RU

История изменений

Исправление ZuBB, (текущая версия) :

спасибо за ответ

переход на любую другую базу пока не рассматриваю.

Еще можно поковырять код на предмет «откуда растут ноги у сложных запросов?». Если сложные запросы выполняют функцию поиска, это повод переходить на search engines (Solr + rails-sunspot), если бизнес-логика, то выносить её на application layer.

вообще то здесь у меня перемешалось и одно и другое. сам по себе поиск не сложный. лишнюю сложность как раз добавляет «бизнес-логика».

напомню

Нужно одним запросом окромя всех данных с таблицы properties собирать данные (имя и телефоны) всех ее owner`ов

нужность "всех данных с таблицы" (или не всех) как раз определяет поиск и его часть в запросе ничтожно мала

WHERE (operation_type_id IN ('1'))
  AND (operation_status_id IN ('1'))
  AND (property_type_id IN ('1'))

Сложность в том что вместе с обьектом нужно показать агента с его телефонами который может быть «прицеплен» к нему и owner`-а/-ов с ихними телефонами.

за это отвечает большой кусок

LEFT JOIN
  ( SELECT GROUP_CONCAT(p.number SEPARATOR ', ') AS agent_phone,
           person_id
   FROM phones p
   GROUP BY p.person_id ) p ON properties.agent_id = p.person_id
JOIN
  ( SELECT po.property_id,
           Group_concat(DISTINCT p2.person SEPARATOR '; ') AS owners
   FROM property_owners po
   JOIN
     ( SELECT po.property_id,
              Concat_ws(' - ', u2.name, u2.phones) AS person
      FROM property_owners po
      JOIN
        ( SELECT u.id,
                 u.name,
                 Group_concat(p.number SEPARATOR ', ') AS phones
         FROM people u
         LEFT JOIN phones p ON u.id = p.person_id
         GROUP BY p.person_id ) u2 ON po.owner_id = u2.id ) p2 ON po.property_id = p2.property_id
   GROUP BY po.property_id ) p3 ON properties.id = p3.property_id

пока весь этот код отрабатывает достаточно быстро (ActiveRecord: 0.2ms, на очень малом количестве данных). Но чисто визуально он мне не нравится и есть некое чувство что его можна улучшить. но пока не знаю как.

вот такое у меня «месиво» в коде. какие сейчас будут идеи?

Исправление ZuBB, :

спасибо за ответ

переход на любую другую базу пока не рассматриваю.

Еще можно поковырять код на предмет «откуда растут ноги у сложных запросов?». Если сложные запросы выполняют функцию поиска, это повод переходить на search engines (Solr + rails-sunspot), если бизнес-логика, то выносить её на application layer.

вообще то здесь у меня перемешалось и одно и другое. сам по себе поиск не сложный. лишнюю сложность как раз добавляет «бизнес-логика».

напомню

Нужно одним запросом окромя всех данных с таблицы properties собирать данные (имя и телефоны) всех ее owner`ов

нужность "всех данных с таблицы" (или не всех) как раз определяет поиск и его часть в запросе ничтожно мала

WHERE (operation_type_id IN ('1'))
  AND (operation_status_id IN ('1'))
  AND (property_type_id IN ('1'))

Сложность в том что вместь с обьектом нужно показать агента с его телефонами который может быть «прицеплен» к нему и owner`-а/-ов с ихними телефонами.

за это отвечает большой кусок

LEFT JOIN
  ( SELECT GROUP_CONCAT(p.number SEPARATOR ', ') AS agent_phone,
           person_id
   FROM phones p
   GROUP BY p.person_id ) p ON properties.agent_id = p.person_id
JOIN
  ( SELECT po.property_id,
           Group_concat(DISTINCT p2.person SEPARATOR '; ') AS owners
   FROM property_owners po
   JOIN
     ( SELECT po.property_id,
              Concat_ws(' - ', u2.name, u2.phones) AS person
      FROM property_owners po
      JOIN
        ( SELECT u.id,
                 u.name,
                 Group_concat(p.number SEPARATOR ', ') AS phones
         FROM people u
         LEFT JOIN phones p ON u.id = p.person_id
         GROUP BY p.person_id ) u2 ON po.owner_id = u2.id ) p2 ON po.property_id = p2.property_id
   GROUP BY po.property_id ) p3 ON properties.id = p3.property_id

пока весь этот код отрабатывает достаточно быстро (ActiveRecord: 0.2ms, на очень малом количестве данных). Но чисто визуально он мне не нравится и есть некое чувство что его можна улучшить. но пока не знаю как.

вот такое у меня «месиво» в коде. какие сейчас будут идеи?

Исходная версия ZuBB, :

спасибо за ответ

переход на любую другую базу пока не рассматриваю.

ще можно поковырять код на предмет «откуда растут ноги у сложных запросов?». Если сложные запросы выполняют функцию поиска, это повод переходить на search engines (Solr + rails-sunspot), если бизнес-логика, то выносить её на application layer.

вообще то здесь у меня перемешалось и одно и другое. сам по себе поиск не сложный. лишнюю сложность как раз добавляет «бизнес-логика».

напомню

Нужно одним запросом окромя всех данных с таблицы properties собирать данные (имя и телефоны) всех ее owner`ов

нужность "всех данных с таблицы" (или не всех) как раз определяет поиск и его часть в запросе ничтожно мала

WHERE (operation_type_id IN ('1'))
  AND (operation_status_id IN ('1'))
  AND (property_type_id IN ('1'))

Сложность в том что вместь с обьектом нужно показать агента с его телефонами который может быть «прицеплен» к нему и owner`-а/-ов с ихними телефонами.

за это отвечает большой кусок

LEFT JOIN
  ( SELECT GROUP_CONCAT(p.number SEPARATOR ', ') AS agent_phone,
           person_id
   FROM phones p
   GROUP BY p.person_id ) p ON properties.agent_id = p.person_id
JOIN
  ( SELECT po.property_id,
           Group_concat(DISTINCT p2.person SEPARATOR '; ') AS owners
   FROM property_owners po
   JOIN
     ( SELECT po.property_id,
              Concat_ws(' - ', u2.name, u2.phones) AS person
      FROM property_owners po
      JOIN
        ( SELECT u.id,
                 u.name,
                 Group_concat(p.number SEPARATOR ', ') AS phones
         FROM people u
         LEFT JOIN phones p ON u.id = p.person_id
         GROUP BY p.person_id ) u2 ON po.owner_id = u2.id ) p2 ON po.property_id = p2.property_id
   GROUP BY po.property_id ) p3 ON properties.id = p3.property_id

пока весь этот код отрабатывает достаточно быстро (ActiveRecord: 0.2ms, на очень малом количестве данных). Но чисто визуально он мне не нравится и есть некое чувство что его можна улучшить. но пока не знаю как.

вот такое у меня «месиво» в коде. какие сейчас будут идеи?