Size: a a a

2021 June 09

B

Bogdan in pro.elixir
получилось через
 on: b.id > a.last_id
источник

B

Bogdan in pro.elixir
правда на select не понятное что-то пока-что выходит)
источник

B

Bogdan in pro.elixir
но думаю щас выведу, то что надо.
источник

B

Bogdan in pro.elixir
cross join я сейчас еще раз посмотрю,  но похоже что это что-то другое.
источник

AN

Alexey Novoselov in pro.elixir
кросс это джоин без условий соединения, который вытащит тебе (все данные из А) * (все данные из В), что нафиг не надо в данном случае
источник

IB

Ilya Borovitinov in pro.elixir
С Lateral это работает иначе, потому что позволять к каждой строке присоединить все из подзапроса
источник

IB

Ilya Borovitinov in pro.elixir
А подзапрос будет строиться на основании строки как раз
источник

AB

Alex Bubnov in pro.elixir
а никто в англояхычных интернетах не видел упоминаний эликсира в pinterest свежее 2015?
источник

AB

Alex Bubnov in pro.elixir
мне нужно что-то решить, что делать со своими патчами на pinterest/elixir-thrift, а мои требования к трифту определенно отличаются от пинтерестовских, насколько они видны из дизайна
источник

AN

Alexey Novoselov in pro.elixir
и получим N+1 джоинов внутри постгреса? пусть охренеет немножко?

> This is a bit dense. Loosely, it means that a LATERAL join is like a SQL foreach loop, in which PostgreSQL will iterate over each row in a result set and evaluate a subquery using that row as a parameter.
источник

B

Bogdan in pro.elixir
from(a in A,
     join: b in B,
     on: b.id > a.last_id,
     preload: [b: b],
     limit: 3_500,
     order_by: [:id]
   )



Написал query, но почему-то он тянет только один row A, хотя я ожидал что он вытащит все A rows, и добавит к каждому b.
источник

IB

Ilya Borovitinov in pro.elixir
Это буквально то, что было в изначальном вопросе у человека. У него там N+1, он спросил как это перенести в один запрос.

Мы используем cross lateral join в аналитических запросах, например, и другими способами это бывает делать значительно сложнее.

Другое дело, что может быть изначальному автору не нужны limit на каждую группу, а нужен общий limit - как оказалось - тогда конечно же cross Lateral join не нужен
источник

B

Bogdan in pro.elixir
лимит нужен на каждую группу.
источник

B

Bogdan in pro.elixir
вот выше он выдает лимит на группу, но почему-то вытягивает только одну А группу.
источник

IB

Ilya Borovitinov in pro.elixir
Он выдаст лимит на все строки в запросе с этим запросом, а не на каждую группу
источник

B

Bogdan in pro.elixir
нет, если через preload грузить то лимит будет на группу.
источник

IB

Ilya Borovitinov in pro.elixir
Не так, как написали вы. Preload в таком синтаксисе не будет делать дополнительных запросов, так как вы явно указали из какого join брать данные
источник

B

Bogdan in pro.elixir
а он по этому отдает только одну одну А потому-что для него только сматчил 3500 записей b?
источник

IB

Ilya Borovitinov in pro.elixir
Скорее всего да
источник

IB

Ilya Borovitinov in pro.elixir
Более того, даже если вы не будете указывать join, а укажете запрос в preload, просто добавить туда limit тоже не сработает, это явно написано в документации
https://hexdocs.pm/ecto/Ecto.Query.html#preload/3-preload-queries
источник