2016-11-02 4 views
0

Ver 14.14 Distrib 5.1.73Active Record (MYSQL) - Wählen Sie unterschiedliche IDs aus mehreren Spalten

activerecord (4.1.14)

ich ein Handelsmodell haben, die zu einem Kreditgeber und Kreditnehmer gehört. Ich möchte alle uniq-Kontrahenten zu den Geschäften einer Institution in einer SQL-Abfrage finden. Die Abfrage unten funktioniert, aber nur, weil ich abflachen & unique-ify das Array nach dem SQL-Abfrage:

Trade.where("borrower_id = :id OR lender_id = :id", id: institution.id).uniq.pluck(:lender_id, :borrower_id).flatten.uniq 

(Ich weiß, das die Institution schließt sich, so dass wir zu normalisieren, nachdem sie mit [1,2,3,4] - [1])

Aber was Ich würde gerne eine Group By Klausel oder etwas verwenden, so dass meine SQL-Abfrage den flatten.uniq Teil handhabt.

Die unten funktioniert nicht, weil es eine verschachtelte Reihe von einzigartigen Kombinationen von lender_id und borrower_id zurück:

Trade.where("borrower_id = :id OR lender_id = :id", id: institution.id).group(:lender_id, :borrower_id).uniq.pluck(:lender_id, :borrower_id) 

=> [[1,2], [1,3], [2,3]] 

Ich möchte eine flache Anordnung von GERADE eindeutigen IDs: [1,2,3]

Irgendwelche Ideen? Vielen Dank!

Antwort

0

Ich verstehe nicht, was Sie versuchen, oder warum Sie eine GROUP BY-Klausel in Abwesenheit von Aggregatfunktionen enthalten möchten.

FWIW, eine gültige Abfrage könnte wie folgt aussehen ...

SELECT DISTINCT t.lender_id 
       , t.borrower_id 
      FROM trades t 
      WHERE 28 IN(t.borrower_id,t.lender_id); 
+0

Dank für die Beantwortung. Ich benutzte eine GROUP BY wegen ähnlicher SO-Posts (http://stackoverflow.com/questions/12188027/mysql-select-distinct-multiple-columns?rq=1) .... Ich bin offen für was auch immer funktioniert! Davon abgesehen führt Ihre Abfrage zu einem verschachtelten Array-Return-Set, das eindeutige _combinations_ von lender_id und borrower_id enthält (zB [[1, 2], [1, 3]]) ... Ich brauche nur die eindeutigen IDs als flaches Array (zB [1,2,3]). – daino3

+0

Ich würde diese Art der Verarbeitung in der App tun. – Strawberry

+0

LOL, das mache ich ('flatten.uniq'), aber ich möchte lernen, wie ich das über SQL/ActiveRecord (daher die Frage) machen kann. Scheint wie ein ziemlich relevanter/häufiger Anwendungsfall. – daino3

Verwandte Themen