[RUBY] [Rails] Comment écrire lors de la création d'une sous-requête

Je souhaite diffuser du SQL avec des sous-requêtes (imbriquées)

Vérifiez avec l'exemple de vérification des données en double.

Former une sous-requête

** 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

Implémenté dans Rails

Conclusion

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

[Rails] Comment écrire lors de la création d'une sous-requête
Comment écrire des rails
Comment écrire des graines de Rails
Comment écrire le routage Rails
Comment écrire une recherche de comparaison de dates dans Rails
[Rails] Comment écrire la gestion des exceptions?
Comment écrire une migration du type Rails datetime au type date
[Basique] Comment écrire un auto-apprentissage Dockerfile ②
Comment insérer une vidéo dans Rails
[Introduction à Java] Comment écrire un programme Java
Comment résoudre les erreurs qui se produisent lors de l'installation de Rails 5.1.3
[rails] Comment créer un modèle partiel
[SpringBoot] Comment écrire un test de contrôleur
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
Comment désinstaller Rails
Comment écrire docker-compose
Comment écrire Mockito
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
[Rails] Comment créer un bouton de partage Twitter
Comment écrire un fichier de migration
Lors de la définition d'une classe, écrivez formatTo ainsi que toString (comment utiliser Formattable)
Comment implémenter une fonctionnalité intéressante dans Ajax avec Rails
[Ruby on Rails] Comment écrire enum en japonais
Comment écrire un test unitaire pour Spring Boot 2
Comment supprimer un objet new_record construit avec Rails
java: Comment écrire une liste de types génériques [Note]
Comment générer manuellement un JWT avec Knock in Rails
[Comment insérer une vidéo dans un hameau avec Rails]
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
[Rails] Comment charger JavaScript dans une vue spécifique
Comment écrire un mod de base dans Minecraft Forge 1.15.2
[rails] Comment publier des images
Comment écrire du bon code
[Rails] Comment utiliser enum
[Rails] Comment utiliser enum
Comment rédiger un commentaire java
Comment laisser un commentaire
Comment lire les itinéraires des rails
[Refactoring] Comment écrire le routage
Comment utiliser la jonction de rails
Comment écrire Junit 5 organisé
Comment terminer le serveur de rails
[Rails] Comment utiliser la validation
Pour écrire un programme orienté utilisateur (1)