Problem jest taki: Chcę pobrać z bazy danych (PostrgreSQL) rekordy z dwoma polami. Pierwsze pole (field1) to integer i to pole powinno być unikalne. Drugie pole (field2) to jakiś varchar z różnymi wartościami - to pole może mieć dowolną wartość, pierwsze z brzegu jakie znajdzie w bazie.
I to działa jak trzeba. Pobiera mi tyle rekordów z field1, ile jest oryginalnych tych rekordów. Dalszy krok, to było kombinowanie, jak to drugie pole wyciągnąć. Tutaj niestety poległem. Próbowałem nawet coś w stylu:
Posiłkowałem się podobnym tematem. Niestety, nic to nie daje i zwraca taki sam wynik co w przypadku 1 kodu.
Ktoś ma pomysł, jak do wyniku zapytania dodać jeszcze dowolne field2? Wartości te teoretycznie powinny być takie same, ale mogą się też różnić. Nie ważne jest, jaka wartość konkretnie jest - byle by pasowała do odpowiedniego field1.
Model.select('DISTINCT field1, MAX(field2) AS cos').group('field1').order('field1').all
Całość nalejpiej zamknąć z scope. Ja generalnie unikam strzelania takich zapytań poprzez modele ActiveRecord. Niby dostajesz kolekcję obiektów tego Modelu, ale albo mają jakieś dodatkowe pola, albo nie maja wyciągniętych części wartości itp. Takie zapytania robię tworzac sobie jakas nowa klase np. do statstyk/raportow itp. a zapytania robie przez ActiveRecord::Base.connection.select_all("…").
niestety w postgresie nie da się tego łatwo zrobić. Potrzebujesz funkcję agregującą FIRST, zależnie od wersji może już być zaimplementowana. Jeżeli nie to ładujesz ją (np. w migracji)
Ok, dzięki za nakierowanie! Wszystko działa jak trzeba
Teraz mam drugie pytanie, trochę powiązane, więc szkoda nowy temat zakładać.
Mianowicie, teraz pod to zapytanie chciałbym “podpiąć” inne, które sprawdza czy przy danym field1 pole field3 występuje gdziekolwiek prawdziwe.
Na zasadzie:
field1 -> integer
field3 -> boolean
Jeśli gdziekolwiek przy field1 pole field3 ma true, to zapytanie powinno wrócić true. Jeśli same false, no to false.
Czy da się to jakoś podpiąć pod poprzednie zapytanie, czy trzeba będzie kombinować z nowym zapytaniem i to jakoś połączyć?
Bo szczerze przyznam, nie bardzo wiem jak do tego podejść. Jedyne co mi przychodzi na myśl, to podzapytanie w tym obecnym… Ale byłbym wdzięczny za nakierowanie
Model.select('field1, bool_or(field3) as field3').group('field1').order('field1').all
Ps. Przy czym jakbyś chciał dodać warunek, to musisz to uczynić przy pomocy having a nie where oraz z tego co pamietam musisz użyć funkcjo agregującej ponownie czyli:
Model.select('field1, bool_or(field3) as field3').group('field1').having('bool_or(field3) = TRUE').order('field1').all