Überprüfen Sie anhand des Beispiels, ob doppelte Daten überprüft werden.
** Benutzertabelle **
id | name | address |
---|---|---|
1 | sasaki | tokyo |
2 | itou | fukuoka |
3 | fujita | nagasaki |
4 | sasaki | osaka |
5 | itou | nagano |
Angenommen, Sie haben eine Tabelle wie die obige. Ich möchte Datensätze mit doppelten Namen abrufen und die Adresse überprüfen.
sql1: Wählen Sie einen mit doppeltem Namen aus
SELECT name FROM users GROUP BY name HAVING count(name) > 1
Ergebnis
name |
---|
itou |
sasaki |
In diesem Fall kennen wir nicht jede Adresse. Führen Sie SQL basierend auf diesem Ergebnis wie folgt aus.
sql2: Basierend auf doppelten Ergebnissen
SELECT * FROM users WHERE name IN ('itou', 'sasaki') ORDER BY name
Ergebnis
id | name | address |
---|---|---|
2 | itou | fukuoka |
5 | itou | nagano |
1 | sasaki | tokyo |
4 | sasaki | osaka |
Wie oben gezeigt, kann auch jede Adresse erhalten werden.
SQL1 und SQL2 werden also zu einer Unterabfrage zusammengefasst.
sql3: Unterabfrage (sql1,sql2)
SELECT * FROM users WHERE name IN (
SELECT name FROM users GROUP BY name HAVING count(name) > 1
)
ORDER BY name
Kann geschrieben werden als
Beliebiger Controller
duplicates = User.select(:name).group(:name).having("count(name) > 1")
@users = User.where(name: duplicates)
SQL ausgeführt werden
Von Rails ausgeführtes SQL
SELECT "users".* FROM "users" WHERE "users"."name" IN (
SELECT "users"."name" FROM "users" GROUP BY "users"."name"
HAVING (count(name) > 1)
)
Überraschenderweise wird nur ein SQL ausgegeben.
Referenz (ganz einfach zu verstehen!) Unterabfragen mit dem IN-Operator von ActiveRecord (Oakbow) bearbeiten
Recommended Posts