2017-10-27 2 views
1

Ich habe zwei Tabellen, Foos und Bars. Bars gehören zu Foos und Foos haben mehrere Bars (via ActiveRecord). Ich möchte ein foo finden, das Bars genau (und nur) eine bestimmte Liste von Bar-Namen hat.SQL-Abfrage für mehrere Übereinstimmungen in derselben Spalte der zugehörigen Tabelle

z. (Entschuldigen Sie bitte irgendeine Pseudo-Code)

bars_list = ["A", "B"] 
foo = find_foo(bars_list) 
foo.bars.map(&:name) = ["A", "B"] 

Suche foo nicht notwendigerweise streng eine Funktion sein müssen. Es kann eine SQL-Abfrage sein, um passende foo ids oder sehr effiziente ActiveRecord-Funktionen zurückzugeben. Vielen Dank!

+0

Was haben Sie bisher versucht? – dmfay

+0

Ich benutzte eine SQL-Abfrage mit einem INNEREN JOIN mit WHERE EXISTS ... bar.name =? ... UND EXISTS ... bar.name =? ... Aber für foos, bei denen sowohl bar.name = "A" als auch bar.name = "B" existierten, wurden keine Übereinstimmungen gefunden. Es hat interessanterweise alle richtigen Fosos zurückgegeben, wenn ich EXISTS verwendet habe ... ODER EXISTS ... aber ich brauche sie, um beide zu existieren. –

Antwort

0

Verwenden GROUP BY und HAVING das Ergebnis für die gewünschte Anzahl an passender bar Bestmarken filtern:

SELECT foos.* 
FROM foos 
JOIN bars ON bars.foo_id = foos.id 
WHERE bars.name IN ('bar1', 'bar2') 
GROUP BY foos.id, foos.name 
HAVING COUNT(*) = 2; 

Wenn Sie drei Namen haben, überprüfen Sie für COUNT(*) = 3 und so weiter.

Verwandte Themen