COUNT avec deux WHERE différents
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:
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!