Mysql
 sql >> Database >  >> RDS >> Mysql

Più tavoli si uniscono in binari

Per riscrivere la query SQL che hai nella tua domanda, penso che dovrebbe essere come la seguente (anche se ho difficoltà a visualizzare completamente le relazioni del tuo modello, quindi questa è un po' congettura):

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

...in modo tale che joins il metodo si prende cura di entrambi i join e di WHERE clausola, seguita infine dal group chiama.

Come altro riferimento:

Se stai unendo più associazioni allo stesso modello puoi semplicemente elencarle :

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

Se ti unisci a tabelle nidificate, puoi elencarle come in un hash:

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

Associazioni nidificate, a più livelli:

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

Puoi anche concatenare le chiamate dell'interfaccia di query ActiveRecord in modo tale che:

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

Se tutto il resto fallisce, puoi sempre passare un frammento SQL direttamente in il joins metodo come trampolino di lancio per passare dalla tua query di lavoro a qualcosa di più incentrato su ARQI

   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