Cela peut être assez facile mais vous ne savez pas comment.
J'ai une table qui peut avoir des valeurs répétées pour un champ de colonne non-clé particulier. Comment puis-je écrire une requête SQL à l'aide de Query Builder ou de Eloquent qui extraira des lignes avec des valeurs distinctes pour cette colonne?
Notez que je ne récupère pas uniquement cette colonne, elle est associée à d'autres valeurs de colonne. Il est donc possible que distinct()
ne fonctionne pas vraiment. Donc, cette question peut être de savoir comment spécifier la colonne que je souhaite distinguer dans une requête maintenant que distinct()
n'accepte aucun paramètre?
Vous devriez utiliser groupby
. Dans Query Builder, vous pouvez le faire comme suit:
$users = DB::table('users')
->select('id','name', 'email')
->groupBy('name')
->get();
Dans Eloquent, vous pouvez également interroger comme ceci:
$users = User::select('name')->distinct()->get();
en éloquent, vous pouvez utiliser cette
$users = User::select('name')->groupBy('name')->get()->toArray() ;
groupBy est en train d'extraire les valeurs distinctes. En fait, le groupe groupera les mêmes valeurs afin que nous puissions utiliser des fonctions d'agrégat sur celles-ci. mais dans ce scénario, nous n'avons pas de fonctions d'agrégat, nous sélectionnons simplement la valeur qui donnera le résultat à des valeurs distinctes
Bien que je sois en retard pour répondre à cette question, une meilleure approche pour obtenir des enregistrements distincts en utilisant Eloquent serait:
$user_names = User::distinct()->get(['name']);
Notez que groupBy
comme utilisé ci-dessus ne fonctionnera pas pour postgres.
Utiliser distinct
est probablement une meilleure option - par exemple. $users = User::query()->distinct()->get();
Si vous utilisez query
, vous pouvez sélectionner toutes les colonnes comme vous le souhaitez.
Le regroupement par ne fonctionnera pas si les règles de la base de données n'autorisent aucun des champs sélectionnés à être en dehors d'une fonction d'agrégat. Utilisez plutôt les collections laravel .
$users = DB::table('users')
->select('id','name', 'email')
->get();
foreach($users->unique('name') as $user){
//....
}
$users = User::select('column1', 'column2', 'column3')->distinct()->get();
récupère les trois colonnes pour des lignes distinctes dans la table. Vous pouvez ajouter autant de colonnes que vous le souhaitez.
$users = Users::all()->unique('name');