- Ymox,
Bonjour tout le monde !
Je brasse toujours du SQL, et là je suis sur quelque chose qui me pose une colle et me fait bien comprendre que du SQL, je ne connais que les grandes largeurs.
Soit le MCD ci-dessous.
Je souhaite récupérer tous les mandats d’un titulaire donné pour un partenaire donné, chacun avec son titulaire, ainsi qu’une règle spécifique (mais les valeurs titulaire, partenaire et défaut) et une configuration pour le partenaire, sachant que les règles titulaire et partenaire comme les configurations peuvent ne pas exister (mais on a toujours l’enregistrement dans la table * disponible). J’espèrerais n’avoir qu’un résultat par mandat.
J’ai pour l’instant les requêtes ci-dessous (j’ai volontairement remplacé la liste des champs dont j’aurais besoin pour alléger).
SELECT
*
FROM
Mandat md
INNER JOIN
Partenaire pn
ON
md.pn_id = pn.id
LEFT JOIN
Configuration co
ON
co.relation_id = pn.id -- relation_id est l'ID d'enregistrement étranger
LEFT JOIN
Configuration disponible cd
ON
co.cd_id = cd.id
AND cd.name = '…'
INNER JOIN
Titulaire ti
ON
md.ti_id = ti.id
LEFT JOIN
Règle de titulaire rt
ON
md.id = rt.md_id
LEFT JOIN
Règle de partenaire rp
ON
rt.rp_id = rp.id
LEFT JOIN
Règle disponible rd
ON
rp.rd_id = rd.id
AND rd.name = '…'
WHERE
(md.pn_id = :partenaireId
OR rp.pn_id = :partenaireId)
AND ti.id = :titulaireId
SELECT
*
FROM
Mandat md
INNER JOIN
Partenaire pn
ON
md.pn_id = pn.id
LEFT JOIN
(SELECT
co.valeur,
cd.relation_id
FROM
Configuration co
INNER JOIN
Configuration disponible cd
ON
co.cd_id = cd.id
AND cd.name = '…'
) ct
ON
ct.relation_id = pn.id
INNER JOIN
Titulaire ti
ON
md.ti_id = ti.id
LEFT JOIN
(SELECT
*
FROM
Règle de titulaire rt
INNER JOIN
Règle de partenaire rp
ON
rt.rp_id = rp.id
INNER JOIN
Règle disponigle rd
ON
rp.rd_id = rd.id
AND rd.name = '…'
) rt
ON
md.id = rt.md_id
WHERE
(md.pn_id = :partenaireId
OR rule_merchant_id = :partenaireId)
AND rt.id = :titulaireId
Le souci avec la première est que j’ai une sorte de produit croisé : je récupère bien la valeur de la règle que je voudrais, mais les enregistrements sont multipliés par la liste de toutes les configurations, alors que j’aurais souhaité n’en avoir qu’une.
Est-ce qu’il y a moyen d’avoir ce que je souhaite en ajoutant des contraintes dans les jointures ou dans le WHERE
dans la première requête ?
Merci d’avance