Vérifiez avec l'exemple de vérification des données en double.
** table des utilisateurs **
id | name | address |
---|---|---|
1 | sasaki | tokyo |
2 | itou | fukuoka |
3 | fujita | nagasaki |
4 | sasaki | osaka |
5 | itou | nagano |
Par exemple, supposons que vous ayez une table comme celle ci-dessus. Je veux récupérer des enregistrements avec des noms en double et vérifier l'adresse.
sql1: sélectionnez-en un avec un nom en double
SELECT name FROM users GROUP BY name HAVING count(name) > 1
résultat
name |
---|
itou |
sasaki |
Dans ce cas, nous ne connaissons pas chaque adresse, donc en fonction de ce résultat, exécutez SQL comme suit.
sql2: basé sur des résultats en double
SELECT * FROM users WHERE name IN ('itou', 'sasaki') ORDER BY name
résultat
id | name | address |
---|---|---|
2 | itou | fukuoka |
5 | itou | nagano |
1 | sasaki | tokyo |
4 | sasaki | osaka |
Comme indiqué ci-dessus, chaque adresse peut également être obtenue.
Donc sql1 et sql2 sont combinés dans une sous-requête.
sql3: sous-requête (sql1,sql2)
SELECT * FROM users WHERE name IN (
SELECT name FROM users GROUP BY name HAVING count(name) > 1
)
ORDER BY name
Peut être écrit comme
Tout contrôleur
duplicates = User.select(:name).group(:name).having("count(name) > 1")
@users = User.where(name: duplicates)
SQL à exécuter
SQL exécuté par Rails
SELECT "users".* FROM "users" WHERE "users"."name" IN (
SELECT "users"."name" FROM "users" GROUP BY "users"."name"
HAVING (count(name) > 1)
)
Étonnamment, un seul SQL est émis.
Référence (assez facile à comprendre!) Gestion des sous-requêtes avec l'opérateur IN d'ActiveRecord (Oakbow)
Recommended Posts