kak-clickhouse icon indicating copy to clipboard operation
kak-clickhouse copied to clipboard

Добавить нормальную реализацию join для КХ для QueryBuilder

Open sanchezzzhak opened this issue 7 years ago • 4 comments

К текущему join сделать ExeptionNotSupport так как структура запроса не работоспособная, ждем улучшения со стороны яндекса может они допилят работу join до стандарта

новый join будет работать согласно спецификации (по другому не умеет)

SELECT
   CounterID,
   hits,
   visits
FROM
(
   SELECT
       CounterID,
       count() AS hits
   FROM test.hits
   GROUP BY CounterID
) ANY LEFT JOIN
(
   SELECT
       CounterID,
       sum(Sign) AS visits
   FROM test.visits
   GROUP BY CounterID
) USING CounterID
ORDER BY hits DESC
LIMIT 10

Создадим 2 метода using($columns) где $columns - это строка или массив колонк queryJoin($type, $query) где $type [GLOBAL] ANY|ALL INNER|LEFT [OUTER]

sanchezzzhak avatar Oct 24 '17 11:10 sanchezzzhak

А не вариант изменить текущий join под данный запрос? В QueryBuilder весь текущий запрос поместить в секцию 'FROM'. Функцию buildJoin научить принимать не [[table, type, condition], [...], ...], а [Query, type, usingCondition]. И еще понадобится изменить саму функцию join, добавив входной параметр select, ибо кликхаус сам не умеет получать ВСЕ сгенерированные столбцы подзапросов и их придется указывать вручную.

В итоге будет чуть сложнее в использовании, но и плюсы есть. В clickhouse на одном уровне возможен только один join, а с такой реализацией если мы будем джоинить несколько запросов, то они будут вложенные друг в друга. Мне такой подход пригодился.

navel avatar Nov 08 '17 14:11 navel

для php5.6 можно в рамках наследования от какого-то класса добавить или сделать меньше параметров на метод можно, а вот для тех, кто использует php7+ это будет ошибка.

несколько решений есть - это или полностью уходить от наследования от базового yii\db\QueryBuilder на собственную реализацию

делать сколько-же параметров что и в наследнике (ваш вариант) или сделать отдельные методы.

sanchezzzhak avatar Nov 08 '17 15:11 sanchezzzhak

У самого php7.0.22, сделал отдельной функцией. Думаю можно и переопределить готовую оставив столько-же параметров, а от идеи с select в параметрах можно отказаться оставив возможность самому вручную уже после join прописывать select.

navel avatar Nov 08 '17 15:11 navel

select хочется автоматизировать, брать все включая using, а если задан select то использовать только его)

у меня ошибку выдает =)

Declaration of kak\clickhouse\Query::join($type, $query, $using, $params = Array) should be compatible with yii\db\Query::join($type, $table, $on = '', $params = Array)

а так хочется параметры переименовать)

sanchezzzhak avatar Nov 08 '17 16:11 sanchezzzhak