8721 sujets

Développement web côté serveur, CMS

Bonjour à tous
Je cherche à récupérer les informations sur tous les auteurs d’œuvres qui ont été ou seront au programme de concerts entre Janvier 2018 et la fin de la saison.
Sachant que certaines oeuvres sont au programme de plusieurs concerts d'une part, et que les programmes comportent différentes oeuvres des mêmes compositeurs, je désire n'avoir qu'un seul exemplaire de chaque auteur.
J'ai écrit la requête suivante:

SELECT DISTINCT * FROM Authors AS a
	JOIN ProgItems AS pi
    	ON pi.authorID = a.authorID	
    JOIN Programs AS p
    	ON p.progID = pi.progID
        WHERE p.lastPerformed BETWEEN '2018-01-01' AND '2019-07-01'
        ORDER BY a.authorID;

Je pense que le code parle de lui-même: Authors est la table des auteurs, ProgramItems celle des œuvres qui sont jouées durant un concert, Programs celle des concerts.
Apparemment ce n'est pas correct: les auteurs se retrouvent plusieurs fois dans le résultat, la clause "DISTINCT" ne semble pas être prise en compte.
Comment faire pour éviter les doublons?
Merci de votre aide.
Modifié par PapyJP (08 Mar 2019 - 15:34)
Salut

Je ne suis pas un expert SQL mais le distinct all, le DISTINCT * est plutôt à éviter. car il va chercher à appliquer le DISTINCT sur l’ensemble des données. la ligne entière.
Il faudrait plutôt "cibler" ton distinct, sur le nom, ou le prénom.

SELECT DISTINCT a.PREMON FROM Authors AS a
	JOIN ProgItems AS pi
    	ON pi.authorID = a.authorID	
    JOIN Programs AS p
    	ON p.progID = pi.progID
        WHERE p.lastPerformed BETWEEN '2018-01-01' AND '2019-07-01'
        ORDER BY a.authorID;
Merci de ta réponse
Ce que je veux récupérer, c'est toute la description de l'auteur, pas seulement son nom et son prénom.
Mais ça me fait penser qu'il doit y avoir une "anomalie" (c'est à dire "un comportement qui ne répond pas aux attentes de l'utilisateur"): DISTINCT ne doit donctionner que si on donne explicitement la liste des colonnes.
Je vais essayer ça et je te dis quoi (comme on dit chez moi)
Effectivement:

SELECT DISTINCT a.authorID, a.firstName, a.lastName, a.birth, a.death, a.url FROM Authors AS a
	JOIN ProgItems AS pi
    	ON pi.authorID = a.authorID	
    JOIN Programs AS p
    	ON p.progID = pi.progID
        WHERE p.lastPerformed BETWEEN '2018-01-01' AND '2019-07-01'
        ORDER BY a.authorID;

fonctionne correctement.
Bizarre...
Modérateur
Bonjour,

Juste par curiosité, est que dans ton cas, ça marche si la requête commence par SELECT DISTINCT a.* FROM Authors AS a ? (c'est à dire qu'on remplace * par a.* ?)

Amicalement,
Meilleure solution
Oui, je pense que c'est ça la bonne réponse

SELECT DISTINCT a.* FROM Authors AS a
	JOIN ProgItems AS pi
    	ON pi.authorID = a.authorID	
    JOIN Programs AS p
    	ON p.progID = pi.progID
        WHERE p.lastPerformed BETWEEN '2018-01-01' AND '2019-07-01'
        ORDER BY a.authorID;