Laravel 5

Group By et Order

Avatar de VincentPIEPLU
VincentPIEPLU

Bonjour,

Pourquoi en faisant cette requête, je ne ressors pas le dernier élément de chaque "category_id" ?

$posts = Post::orderBy('created_at', 'desc')
            ->groupBy('category_id')
            ->take(4)
            ->get();

Merci

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Salut,

Pour autant que je sache MySQL traite le GroupBy avant le OrderBy, du coup tu ne peux pas savoir quelle ligne sera choisie. Il faut voir le GroupBy essentiellement pour faire des agrégations. Peut-être que ce qu'il te faut c'est plutôt Distinct.

Posté il y a 1 mois
Avatar de VincentPIEPLU
VincentPIEPLU

J'ai aussi testé le distinct sans le groupBy mais ça me renvoie tous les élements car il ne sait pas sur quoi "être distinct"

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Tu peux appliquer le Distinct sur ta colonne category_id.

Posté il y a 1 mois
Avatar de VincentPIEPLU
VincentPIEPLU

Peut-être que je l'utilise mal, mais j'ai lu qu'on ne pouvait pas mettre de nom de colonne dans le distinct comme je le teste ici :

        $posts = Post::orderBy('published_at', 'desc')
            ->distinct('category_id')
            ->take(4)
            ->get();
Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Ah oui je viens de vérifier dans le core, distinct n'accepte pas de paramètre... C'est dommage ça...

Mais tu peux quand même le forcer : selectRaw('DISTINCT category_id')

Posté il y a 1 mois
Avatar de VincentPIEPLU
VincentPIEPLU

Oui, j'ai testé ton idée qui est quasi top, seulement impossible de joindre les autres colonnes.

J'ai même tenté de modifer en :

$posts = Post::select(DB::raw('DISTINCT(category_id)'), 'name')
            ->orderBy('published_at', 'desc')
            ->get();

Quand on fait ça, on refait apparaitre les autres lignes de la DB :(

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

S'il y a des valeurs différentes dans certaines colonnes forcément les lignes sont distinctes.

Posté il y a 1 mois
Avatar de VincentPIEPLU
VincentPIEPLU

Sauf que je veux "distincts" que sur catégory_id

J'ai 4 catégory_id. Je souhaite juste récupérer le dernier élément de chaque catégorie avec les valeurs associées.

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Peut-être avec une sous-requête :

$posts = Post::whereIn('id', function($q)
    {
        $q->selectRaw('MAX(id)')
             ->from('posts')
             ->groupBy('category_id');
    })
    ->take(4)
    ->get();
Posté il y a 1 mois
Avatar de VincentPIEPLU
VincentPIEPLU

Merci, parfait !

Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.