Req SQL - Récupérer catégories, et COUNT nb métiers par catégorie, mais les métiers qui n'ont aucun professionnel joint, ne pas les compter.

a marqué ce sujet comme résolu.

Bonjour.

SVP, je viens demander de l’aide pour finir une requête SQL. Mon objectif est de récupérer toute les catégories, et de compter nombre de métiers par catégorie. Mais les métiers qui n’ont aucun professionnel joint, ne pas les compter.

C’est la 1ère fois que je tente de faire quelques chose comme ça, donc je galère.

Voici mon code (c’est du Laravel, mais ça reste compréhensible pour tout les dév) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

/**
 * Prendre en compte 3 Models : Categorie - Metier - Professionnel
 *
 * L'objectif :
 * Récupérer toute les catégories, et compter nombre de métiers par catégorie.
 * Mais les métiers qui n'ont aucun professionnel joint, ne pas les compter.
 */
public function getCategoriesAndCountMetiersByCategorieIfMetierHasMinimumOneProfessional()
{
    return Categorie::select([
        Categorie::TABLE.'.id',
        Categorie::TABLE.'.h1',
        Categorie::TABLE.'.slug',
        DB::raw('COUNT('.Metier::TABLE.'.id) as nbMetiersJoined')
    ])

    // jointures avec Metier (Categorie a relation Many to Many avec Metier)
    ->join(
        Categorie::TABLE_INTERMEDIATE_JOINED_TO_METIERS,
        Categorie::TABLE.'.id', '=', Categorie::TABLE_INTERMEDIATE_JOINED_TO_METIERS.'.metier_id'
    )
    ->join(
        Metier::TABLE,
        Metier::TABLE.'.id', '=', Categorie::TABLE_INTERMEDIATE_JOINED_TO_METIERS.'.categorie_id'
    )

    ->groupBy(Categorie::TABLE.'.id', Categorie::TABLE.'.h1', Categorie::TABLE.'.slug')
    ->orderBy(Categorie::TABLE.'.h1', 'ASC')
    ->get();
}

Ceci me compte le nombre de métiers par catégories. Même les métiers qui ne sont joints à aucun prestataires sont pris en compte. Alors que je veux prendre en compte dans le COUNT que les métier qui sont joints à au moins 1 professionnel.

Je souhaiterai savoir si ce que je demande est techniquement possible ? Et si oui, j’aimerais savoir ce que je doit rajouter pour arriver à la solution que je souhaite ?

Merci beaucoup.

+0 -0

Salut !

Tu as une manière de récupérer le SQL qui est généré par cette méthode ? Parce que je me demande si ça ne pourrait pas être des soucis de "type de jointure", et je ne vois pas ici de spécification, ni ne sais quel est le type "par défaut" d’Eloquent.

Edit

Si jamais, la coloration syntaxique du PHP ne se fait que s’il y a un <?php dans l’extrait  ;)

+0 -0

Salut !

Tu as une manière de récupérer le SQL qui est généré par cette méthode ? Parce que je me demande si ça ne pourrait pas être des soucis de "type de jointure", et je ne vois pas ici de spécification, ni ne sait quel est le type "par défaut" d’Eloquent.

Edit

Si jamais, la coloration syntaxique du PHP ne se fait que s’il y a un <?php dans l’extrait  ;)

Ymox

Merci pour ta réponse, en gros, pour récupérer la requête SQL, je fait comme ceci :

1
2
3
4
5
6
7
8
9
<?php

$categorie = new Categorie();

$categories = $categorie->getCategoriesAndCountMetiersByCategorieIfMetierHasMinimumOneProfessional();

foreach ($categories as $categorie)
    echo $categorie->h1.' '.$categorie->nbMetiersJoined;
}

En SQL, ça donne ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
SELECT `categories`.`id`, `categories`.`h1`, `categories`.`slug`,
COUNT(metiers.id) as nbMetiersJoined

FROM `categories`

INNER JOIN `categories_metiers_pivot`
    ON `categories`.`id` = `categories_metiers_pivot`.`categorie_id`

INNER JOIN `metiers`
    ON `metiers`.`id` = `categories_metiers_pivot`.`metier_id`

GROUP BY `categories`.`id`, `categories`.`h1`, `categories`.`slug`
ORDER BY `categories`.`h1` ASC
+0 -0

Merci, mais j’aimerais voir le SQL généré par tout ça  ^^

La commande qui est envoyée au serveur SQL, donc.

Edit

Voilà, le temps que je poste et c’est mis, désolé. Ne réponds pas, je regarde et édite mon message.

Edit 2

Il ne me semble pas y avoir de jointure sur la table des professionnels, c’est normal ?

+0 -0

Merci, mais j’aimerais voir le SQL généré par tout ça  ^^

La commande qui est envoyée au serveur SQL, donc.

Edit

Voilà, le temps que je poste et c’est mis, désolé. Ne réponds pas, je regarde et édite mon message.

Edit 2

Il ne me semble pas y avoir de jointure sur la table des professionnels, c’est normal ?

Ymox

Justement, je ne l’ai pas ajoutée car je ne sais pas trop comment l’ajouter "proprement" et faire en sorte de résoudre mon problème.

Si je l’ajoute ça donne ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
SELECT `categories`.`id`, `categories`.`h1`, `categories`.`slug`,
COUNT(metiers.id) as nbMetiersJoined

FROM `categories`

INNER JOIN `categories_metiers_pivot`
    ON `categories`.`id` = `categories_metiers_pivot`.`categorie_id`
INNER JOIN `metiers`
    ON `metiers`.`id` = `categories_metiers_pivot`.`metier_id`

INNER JOIN `professionels_metiers_pivot`
    ON `metiers`.`id` = `professionels_metiers_pivot`.`metier_id`
INNER JOIN `professionels`
    ON `professionels`.`id` = `professionels_metiers_pivot`.`professionel_id`

GROUP BY `categories`.`id`, `categories`.`h1`, `categories`.`slug`
ORDER BY `categories`.`h1` ASC

Mais la, si par exemple 2 prestataires sont joint avec un même métier, ça me compte 2 fois un métiers pour une catégorie.

J’ai l’impression que si je rajoute "DISTINCT" juste après "COUNT" que ça résous mon problème. Mais je ne suis pas sur que ce soit la meilleur manière.

Merci.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte