polypush135

polypush135

Proper way to subquery on a join in ecto

In short this was what I tried to do.

from(q in query,
      join:
        va in ^from(va in VideoAnalysis,
          where: va.id == ^video_id,
          limit: 1,
          order_by: [desc: :inserted_at]
        ),
      join: v in assoc(va, :video),
      where: v.id == ^video_id
    )

But soon found that …

 ** (Ecto.QueryError) ....query.ex:108: queries in joins can only have `where` conditions in query:

     from c in Clip,
       join: v0 in ^#Ecto.Query<from v in VideoAnalysis, where: v.id == ^7275, order_by: [desc: v.inserted_at], limit: 1>,
       join: v1 in assoc(v0, :video),
       where: v1.id == ^7275
       select: c

trying to figure out how I can query for all the records of a thing through an intermediate record.
IE say I have a VideoAnalysis record that belongs_to a video and has many clips.
How can I query for all the clips of a video analysis if all I know if the video id?

But there is a catch in my case join: video_analysis in assoc(c, :video_analysis), would return multiple records.

Q: How could I make it to where I can limit it to only the newest based on inserted at for VideoAnalysis
in short I’m trying to do all this in the Ecto Query with just one query
if that is even possible

Marked As Solved

LostKobrakai

LostKobrakai

newest_videoanalysis = 
  from va in VideAnalysis,
  order_by: [desc: va.inserted_at],
  where: va.video_id == ^video_id,
  limit: 1

from clips in Clips,
  join: nva in subquery(newest_videoanalysis), on: clips.video_analysis_id == nva.id

Also Liked

polypush135

polypush135

Awesome thank you. Yeah I guess I may have caused that to not work with leaving the extra join in that from clips.

idi527

idi527

:wave:

Have you tried using subquery/2?

latest_video_analysis =
  from va in VideoAnalysis,
    where: va.id == ^video_id,
    limit: 1,
    order_by: [desc: :inserted_at]

from v in Video,
  join: va in subquery(latest_video_analysis), on: v.id == va.video_id,
  where: v.id == ^video_id

Not sure if it would even work …

idi527

idi527

What about a subquery in a lateral join then? Ah, it’s not necessary actually. What about this?

latest_video_analysis =
  from va in VideoAnalysis,
    where: va.video_id == ^video_id,
    limit: 1,
    order_by: [desc: :inserted_at]

from c in Clip,
  join: va in subquery(latest_video_analysis),
  where: c.video_analisis_id == va.id

Where Next?

Popular in Questions Top

dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
Kagamiiiii
Student &amp; New to elixir. Nice language. I want to convert a english character, e.g. “a”, which is stored in a variable, to it’s asci...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
Codball
Mix format works fine if run from the cmd. I’ve followed this to facilitate the implementation into VSC which involves downloading an ext...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

Other popular topics Top

_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 35421 110
New
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lis...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New

We're in Beta

About us Mission Statement