Bonjour!
Dans une requête, je récupère les titres d'ouvrages auxquels sont associés des livres à vendre et des vendeurs. Je veux afficher le nombre de livre invendu pour les vendeurs dont le compte est actif et dont le compte est inactif.

Pour vous épargner les détails, ce que je veux faire en gros est de compter les lignes d'une même table avec deux condition WHERE différentes, le tout étant imbriqué en sous-requêtes.

Bref, si mes explications ne sont pas claires, j'ai déjà un code qui fonctionne bien mais je tente de l'optimiser et de le raccourcir :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
33
34
35
36
37
38
39
40
41
42
43
44
SELECT
   O.idOuvrage,
   O.titre,
 
   COUNT(DISTINCT idLivre) AS nbreLivres,
 
   -- Livres invendus, des vendeurs dont le compte est actif
   (SELECT COUNT(idLivre)
      FROM
         livres AS L
         LEFT JOIN vendeurs AS E         ON L.idVendeur = E.idVendeur
      WHERE
         dateVente IS NULL AND
         idOuvrage = O.idOuvrage AND
         -- TRUE pour un compte actif, FALSE pour un compte inactif
         DATEDIFF(DATE_ADD(dateDerniereActivite, INTERVAL 2 YEAR), NOW()) >= 0
      ) AS nbreLivresActifs,
 
   -- Livres invendus des vendeurs dont le compte est inactif
   -- Notez que la sous-requête ci-dessous est quasiment identique à
   -- la première à l'exception de la condition WHERE
   (SELECT COUNT(idLivre)
      FROM
         livres AS L
            LEFT JOIN vendeurs AS E      ON L.idVendeur = E.idVendeur
      WHERE
         dateVente IS NULL AND
         idOuvrage = O.idOuvrage AND
         -- TRUE pour un compte inactif, FALSE pour un compte actif
         DATEDIFF(DATE_ADD(dateDerniereActivite, INTERVAL 2 YEAR), NOW()) < 0
      ) AS nbreLivresInactifs,
 
   GROUP_CONCAT(DISTINCT 
      CONCAT_WS(' ', A.prenom, A.nom)
      ORDER BY A.nom
      SEPARATOR ', '
      ) AS listeAuteurs      
   FROM ouvrages AS O
      LEFT JOIN livres AS L         ON O.idOuvrage = L.idOuvrage
      LEFT JOIN ouvrages_auteurs AS OA   ON O.idOuvrage = OA.idOuvrage
      LEFT JOIN auteurs AS A         ON OA.idAuteur = A.idAuteur
   WHERE L.dateVente IS NULL
   GROUP BY O.idOuvrage
   ORDER BY O.titre
Merci à l'avance de votre aide!

La question est longue mais je crois bien que quelqu'un de compétent puisse y répondre sans stagner pendant des heures comme je viens de le faire!