Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mehrere Tische verbinden sich in Schienen

Um die SQL-Abfrage, die Sie in Ihrer Frage haben, neu zu schreiben, sollte sie meiner Meinung nach wie folgt aussehen (obwohl es mir schwer fällt, Ihre Modellbeziehungen vollständig zu visualisieren, daher ist dies ein bisschen Vermutung):

RagaContextApplicantsSong.
  joins(:raga_contest_applicants => [:raga_content_rounds], :contest_cat).
  group('raga_contest_rounds.contest_cat_id')

...so dass der joins -Methode kümmert sich sowohl um die beiden Joins als auch um das WHERE -Klausel, gefolgt schließlich von der group anrufen.

Als weitere Referenz:

Wenn Sie mehreren Assoziationen demselben Modell beitreten können Sie sie einfach auflisten :

Post.joins(:category, :comments)
Returns all posts that have a category and at least one comment

Wenn Sie verschachtelte Tabellen verbinden, können Sie sie wie in einem Hash auflisten:

Post.joins(:comments => :guest)
Returns all comments made by a guest

Verschachtelte Assoziationen, mehrere Ebenen:

Category.joins(:posts => [{:comments => :guest}, :tags])
Returns all posts with their comments where the post has at least one comment made by a guest

Sie können Aufrufe der ActiveRecord-Abfrageschnittstelle auch wie folgt verketten:

Post.joins(:category, :comments)
...produces the same SQL as...
Post.joins(:category).joins(:comments)

Wenn alles andere fehlschlägt, können Sie jederzeit ein SQL-Fragment direkt hineingeben der joins Methode als Sprungbrett, um von Ihrer Arbeitsabfrage zu etwas mehr ARQI-zentriertem zu gelangen

   Client.joins('LEFT OUTER JOIN addresses ON addresses.client_id = clients.id')
=> SELECT clients.* FROM clients LEFT OUTER JOIN addresses ON addresses.client_id = clients.id