Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2021-08-16T21:24:49+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Jointures en pagaille : éviter des produits croisés, message #2367462021-08-16T21:24:49+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/15563/jointures-en-pagaille-eviter-des-produits-croises/?page=1#p236746<p>Bon, après avoir essayé diverses choses, j’en conclus que ce n’est pas possible comme je l’imaginais.</p>
<p>Merci à vous deux pour votre aide <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>Jointures en pagaille : éviter des produits croisés, message #2364012021-08-02T10:40:57+02:00elegance/@elegancehttps://zestedesavoir.com/forums/sujet/15563/jointures-en-pagaille-eviter-des-produits-croises/?page=1#p236401<p>Je proposais ceci :</p>
<div class="custom-block custom-block-spoiler"><div class="custom-block-body"><div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span>
<span class="hljs-keyword">FROM</span> Mandat md
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Partenaire pn
<span class="hljs-keyword">ON</span> md.pn_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> Configuration co
<span class="hljs-keyword">ON</span> co.relation_id <span class="hljs-operator">=</span> pn.id <span class="hljs-comment">-- relation_id est l'ID d'enregistrement étranger</span>
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> Configuration disponible cd
<span class="hljs-keyword">ON</span> co.cd_id <span class="hljs-operator">=</span> cd.id
<span class="hljs-keyword">AND</span> cd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Titulaire ti
<span class="hljs-keyword">ON</span> md.ti_id <span class="hljs-operator">=</span> ti.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> (<span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span>
<span class="hljs-keyword">FROM</span> Règle de titulaire rt
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Règle de partenaire rp
<span class="hljs-keyword">ON</span> rt.rp_id <span class="hljs-operator">=</span> rp.id
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Règle disponigle rd
<span class="hljs-keyword">ON</span> rp.rd_id <span class="hljs-operator">=</span> rd.id
<span class="hljs-keyword">AND</span> rd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
) rt
<span class="hljs-keyword">ON</span> md.id <span class="hljs-operator">=</span> rt.md_id
<span class="hljs-keyword">WHERE</span> (md.pn_id <span class="hljs-operator">=</span> :partenaireId
<span class="hljs-keyword">OR</span> rp.pn_id <span class="hljs-operator">=</span> :partenaireId)
<span class="hljs-keyword">AND</span> ti.id <span class="hljs-operator">=</span> :titulaireId
</code></pre></div></div></div>
<p>Le group by te permettrait de dire <<em>group by pn.id, md.id, ti.id</em>> par exemple. Et donc garder une seule ligne pour chaque combinaison de ces 3 éléments. </p>
<p>Les sous-requetes sont souvent indispensables. Pour la lisibilité (et ça a aussi d’autres avantages), ta 2ème requête peut aussi s’écrire comme ceci :</p>
<div class="custom-block custom-block-spoiler"><div class="custom-block-body"><div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">with</span>
ct <span class="hljs-keyword">as</span> (
<span class="hljs-keyword">SELECT</span> co.valeur, cd.relation_id
<span class="hljs-keyword">FROM</span> Configuration co
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Configuration disponible cd
<span class="hljs-keyword">ON</span> co.cd_id <span class="hljs-operator">=</span> cd.id
<span class="hljs-keyword">AND</span> cd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
),
rt <span class="hljs-keyword">as</span> (
<span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span>
<span class="hljs-keyword">FROM</span> Règle de titulaire rt
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Règle de partenaire rp
<span class="hljs-keyword">ON</span> rt.rp_id <span class="hljs-operator">=</span> rp.id
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Règle disponigle rd
<span class="hljs-keyword">ON</span> rp.rd_id <span class="hljs-operator">=</span> rd.id
<span class="hljs-keyword">AND</span> rd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
)
<span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span>
<span class="hljs-keyword">FROM</span> Mandat md
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Partenaire pn
<span class="hljs-keyword">ON</span> md.pn_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> ct
<span class="hljs-keyword">ON</span> ct.relation_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Titulaire ti
<span class="hljs-keyword">ON</span> md.ti_id <span class="hljs-operator">=</span> ti.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> rt
<span class="hljs-keyword">ON</span> md.id <span class="hljs-operator">=</span> rt.md_id
<span class="hljs-keyword">WHERE</span>
(md.pn_id <span class="hljs-operator">=</span> :partenaireId
<span class="hljs-keyword">OR</span> rule_merchant_id <span class="hljs-operator">=</span> :partenaireId)
<span class="hljs-keyword">AND</span> rt.id <span class="hljs-operator">=</span> :titulaireId
</code></pre></div></div></div>Jointures en pagaille : éviter des produits croisés, message #2363952021-08-02T00:14:40+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/15563/jointures-en-pagaille-eviter-des-produits-croises/?page=1#p236395<figure><blockquote>
<p>C’est compliqué pour le lecteur de se plonger dans tout ça.</p>
</blockquote><figcaption><a href="#p236388">elegance</a></figcaption></figure>
<p>Et je le conçois volontiers. Verrais-tu quelque chose qui pourrait (t’)aider ?</p>
<figure><blockquote>
<p>Je vois des choses sur les alias, et je suis surpris que MySQL accepte ça. Dans la première requête, en ligne 28, tu as ru.rp_id , mais l’alias ru n’existe nulle part.</p>
<p>Dans la 2ème requête, en ligne 10 et 11, tu as ct.text_value et ct.value_type, alors qu’à ce niveau, ct n’existe pas.</p>
<p>Corriger ces 2 points ne va peut-être pas aider, mais ça ne peut pas faire de mal.</p>
</blockquote><figcaption><a href="#p236388">elegance</a></figcaption></figure>
<p>J’ai corrigé ces histoires d’alias, ce sont de mauvaises adaptations pour ce sujet <img src="/static/smileys/svg/rouge.svg" alt=":honte:" class="smiley"><br>
Pour avoir pris des noms de tables plus parlants et des alias en conséquence, je me suis retrouvé à remplacer ces derniers là où je ne l’aurais pas dû et oublier des endroits où je l’aurais dû.</p>
<figure><blockquote>
<p>Entre la requête 1 et la requête 2, tu as modifié la façon d’accéder aux 2 tables 'Config' et aux 3 tables 'Règles’. Est-ce que ça marche si tu changes uniquement les lignes correspondant aux tables 'Config' par exemple ?</p>
</blockquote><figcaption><a href="#p236388">elegance</a></figcaption></figure>
<p>Désolé, mais je ne comprends pas ce que tu veux dire par « changer les lignes correspondant aux tables Config », je peux te demander d’être plus explicite.</p>
<figure><blockquote>
<p>Pourquoi la requête 2 ne te plait-elle pas ?</p>
</blockquote><figcaption><a href="#p236388">elegance</a></figcaption></figure>
<p>La requête 2 « ne me plaît pas » parce que je suis moins à l’aise à la conception avec les sous-requêtes. D’autre part, je souhaite savoir s’il y a des finesses possibles avec les jointures, et donc quelque chose à apprendre.</p>
<figure><blockquote>
<p>Pour étudier tout ça, il faudrait avancer étape par étape. Tu gardes uniquement les tables de base :</p>
<div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span>
<span class="hljs-keyword">FROM</span> Mandat md
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Partenaire pn
<span class="hljs-keyword">ON</span> md.pn_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> Configuration co
<span class="hljs-keyword">ON</span> co.relation_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> Configuration disponible cd
<span class="hljs-keyword">ON</span> co.cd_id <span class="hljs-operator">=</span> cd.id
<span class="hljs-keyword">AND</span> cd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Titulaire ti
<span class="hljs-keyword">ON</span> md.ti_id <span class="hljs-operator">=</span> ti.id
<span class="hljs-keyword">WHERE</span> (md.pn_id <span class="hljs-operator">=</span> :partenaireId)
<span class="hljs-keyword">AND</span> ti.id <span class="hljs-operator">=</span> :titulaireId
</code></pre></div>
<p>Si cette requête donne le nombre de lignes voulues, tu ajoutes plus de tables ; sinon, tu cherches pourquoi ça ne va pas.</p>
</blockquote><figcaption><a href="#p236388">elegance</a></figcaption></figure>
<p>Merci, j’aurais dû commencer par là. Je vais prendre le temps de regarder ça demain. </p>
<figure><blockquote>
<p>Distinct ne peut pas convenir ; group by peut solutionner ton problème, mais ce n’est pas sain.</p>
</blockquote><figcaption><a href="#p236388">elegance</a></figcaption></figure>
<p>On semble d’accord pour <code>DISTINCT</code>, par contre je ne vois pas vraiment comment un <code>GROUP BY</code> pourrait aider, à moins d’ajouter un tri personnalisé avec <code>ORDER BY FIELD(…)</code>, peut-être ?</p>Jointures en pagaille : éviter des produits croisés, message #2363882021-08-01T14:55:49+02:00elegance/@elegancehttps://zestedesavoir.com/forums/sujet/15563/jointures-en-pagaille-eviter-des-produits-croises/?page=1#p236388<p>C’est compliqué pour le lecteur de se plonger dans tout ça.</p>
<p>Je vois des choses sur les alias, et je suis surpris que MySQL accepte ça. Dans la première requête, en ligne 28, tu as ru.rp_id , mais l’alias ru n’existe nulle part.</p>
<p>Dans la 2ème requête, en ligne 10 et 11, tu as ct.text_value et ct.value_type, alors qu’à ce niveau, ct n’existe pas.</p>
<p>Corriger ces 2 points ne va peut-être pas aider, mais ça ne peut pas faire de mal.</p>
<p>Entre la requête 1 et la requête 2, tu as modifié la façon d’accéder aux 2 tables 'Config' et aux 3 tables 'Règles’. Est-ce que ça marche si tu changes uniquement les lignes correspondant aux tables 'Config' par exemple ?</p>
<p>Pourquoi la requête 2 ne te plait-elle pas ?</p>
<p>Pour étudier tout ça, il faudrait avancer étape par étape. Tu gardes uniquement les tables de base :</p>
<div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span>
<span class="hljs-keyword">FROM</span> Mandat md
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Partenaire pn
<span class="hljs-keyword">ON</span> md.pn_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> Configuration co
<span class="hljs-keyword">ON</span> co.relation_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> Configuration disponible cd
<span class="hljs-keyword">ON</span> co.cd_id <span class="hljs-operator">=</span> cd.id
<span class="hljs-keyword">AND</span> cd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> Titulaire ti
<span class="hljs-keyword">ON</span> md.ti_id <span class="hljs-operator">=</span> ti.id
<span class="hljs-keyword">WHERE</span> (md.pn_id <span class="hljs-operator">=</span> :partenaireId )
<span class="hljs-keyword">AND</span> ti.id <span class="hljs-operator">=</span> :titulaireId
</code></pre></div>
<p>Si cette requête donne le nombre de lignes voulues, tu ajoutes plus de tables ; sinon, tu cherches pourquoi ça ne va pas.</p>
<p>Distinct ne peut pas convenir ; group by peut solutionner ton problème, mais ce n’est pas sain.</p>
<p>Ici, tu as des filtres name=’…' sur des tables qui sont 'en bout de chaine’. Tes 2 sous-requêtes me paraissent vraiment la bonne solution.</p>Jointures en pagaille : éviter des produits croisés, message #2363872021-08-01T10:58:31+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/15563/jointures-en-pagaille-eviter-des-produits-croises/?page=1#p236387<p>Les colonnes sont plus ou moins les suivantes (en reprenant les alias de tables utilisés dans le premier message) :</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span></div><pre><code class="hljs language-text">md.*,
ti.*, /* avec des alias préfixés par ti_ pour les colonnes qui se retrouveraient
* dans celles des mandats, d'où le "plus ou moins" */
rt.valeur AS rt_valeur,
rp.valeur AS rp_valeur,
rd.nom AS rd_nom,
rd.valeur_defaut AS rd_valeur_defaut,
co.valeur AS co_valeur
</code></pre></div>
<p>J’avais tenté d’ajouter <code>DISTINCT</code> dans la requête, mais je n’ai pas vu de différence (même nombre de résultats retournés), d’où mon idée de creuser plus du côté des expressions de jointure ou de filtration.</p>
<p>Quand je ne cible qu’un seul mandat, il sort bien dans mes résultats, mais autant de fois que j’ai de configurations, et ce même si elles n’ont pas été "instanciées" pour ce que je cherche. Si je duplique l’expression sur le nom de la configuration dans le <code>WHERE</code>, j’exclus les mandats pour lesquels cette configuration n’a pas été "instanciée".</p>
<p>P.S. : je ne sais pas si les cardinalités sont placées de manière compréhensible sur le MCD, j’ai repris la manière de faire de MySQL Workbench quand on sélectionne UML. Pour les relations entre Titulaire, Mandat et Partenaire par exemple :</p>
<ul>
<li>un titulaire possède au minimum un mandat, mais un mandat n’est qu’à un seul titulaire ;</li>
<li>un mandat fait la liaison entre un partenaire et un titulaire ;</li>
<li>un partenaire peut n’avoir aucun mandat comme il peut en avoir plusieurs, un pour chaque titulaire intéressé.</li>
</ul>Jointures en pagaille : éviter des produits croisés, message #2363852021-07-31T23:52:29+02:00SpaceFox/@SpaceFoxhttps://zestedesavoir.com/forums/sujet/15563/jointures-en-pagaille-eviter-des-produits-croises/?page=1#p236385<p>Si je comprends bien les informations que tu donnes, je pense que ça peut se régler en :</p>
<ol>
<li>Ajoutant une ou plusieurs contraintes sur la configuration à récupérer, ou</li>
<li>Ajoutant un <code>distinct</code> à ton <code>select</code>.</li>
</ol>
<p>Mais pour en dire plus, il faudrait avoir des précisions sur les colonnes qui tu as omis, justement.</p>
<p>D’autre part, tu peux tout à fait faire quelque chose du genre (exemple complètement fictif) pour sélectionner toutes les lignes de A qui n’a pas de B correspondant :</p>
<div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">select</span> A.<span class="hljs-operator">*</span>
<span class="hljs-keyword">from</span> A
<span class="hljs-keyword">left</span> <span class="hljs-keyword">outer</span> <span class="hljs-keyword">join</span> B <span class="hljs-keyword">on</span> B.a_id <span class="hljs-operator">=</span> a.id
<span class="hljs-keyword">where</span> B.id <span class="hljs-keyword">is</span> <span class="hljs-keyword">null</span>
</code></pre></div>
<p>(A a au moins une colonne <code>id</code>, B a au moins une colonne <code>id</code> et une colonne <code>a_id</code> qui est une référence sur <code>A.id</code>)</p>
<p>PS : Il <em>me semble</em> qu’il y a une autre syntaxe pour faire ce que j’ai écrit, mais je ne l’ai plus sous la main.</p>Jointures en pagaille : éviter des produits croisés, message #2363842021-07-31T23:36:32+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/15563/jointures-en-pagaille-eviter-des-produits-croises/?page=1#p236384<p>Bonjour tout le monde !</p>
<p>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.</p>
<p>Soit le MCD ci-dessous.</p>
<p><img src="/media/galleries/5764/6c02509f-ff3f-44f5-a9db-5fb19ec82602.svg"></p>
<p>Je souhaite récupérer tous les <strong>mandats</strong> d’un <strong>titulaire</strong> donné pour un <strong>partenaire</strong> donné, chacun avec son <em>titulaire</em>, ainsi qu’une <strong>règle</strong> spécifique (mais les valeurs <em>titulaire</em>, <em>partenaire</em> et <em>défaut</em>) et une <strong>configuration</strong> 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 <em>* disponible</em>). J’espèrerais n’avoir qu’un résultat par mandat.</p>
<p>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).</p>
<div class="custom-block custom-block-spoiler"><div class="custom-block-heading">La requête — qui ne fonctionne pas comme je le souhaiterais</div><div class="custom-block-body"><div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">SELECT</span>
<span class="hljs-operator">*</span>
<span class="hljs-keyword">FROM</span>
Mandat md
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span>
Partenaire pn
<span class="hljs-keyword">ON</span>
md.pn_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span>
Configuration co
<span class="hljs-keyword">ON</span>
co.relation_id <span class="hljs-operator">=</span> pn.id <span class="hljs-comment">-- relation_id est l'ID d'enregistrement étranger</span>
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span>
Configuration disponible cd
<span class="hljs-keyword">ON</span>
co.cd_id <span class="hljs-operator">=</span> cd.id
<span class="hljs-keyword">AND</span> cd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span>
Titulaire ti
<span class="hljs-keyword">ON</span>
md.ti_id <span class="hljs-operator">=</span> ti.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span>
Règle de titulaire rt
<span class="hljs-keyword">ON</span>
md.id <span class="hljs-operator">=</span> rt.md_id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span>
Règle de partenaire rp
<span class="hljs-keyword">ON</span>
rt.rp_id <span class="hljs-operator">=</span> rp.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span>
Règle disponible rd
<span class="hljs-keyword">ON</span>
rp.rd_id <span class="hljs-operator">=</span> rd.id
<span class="hljs-keyword">AND</span> rd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
<span class="hljs-keyword">WHERE</span>
(md.pn_id <span class="hljs-operator">=</span> :partenaireId
<span class="hljs-keyword">OR</span> rp.pn_id <span class="hljs-operator">=</span> :partenaireId)
<span class="hljs-keyword">AND</span> ti.id <span class="hljs-operator">=</span> :titulaireId
</code></pre></div></div></div>
<div class="custom-block custom-block-spoiler"><div class="custom-block-heading">La requête qui me retourne ce que j’espérais pour mon jeu de données de test</div><div class="custom-block-body"><div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span><span data-count="40"></span><span data-count="41"></span><span data-count="42"></span><span data-count="43"></span><span data-count="44"></span><span data-count="45"></span><span data-count="46"></span><span data-count="47"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">SELECT</span>
<span class="hljs-operator">*</span>
<span class="hljs-keyword">FROM</span>
Mandat md
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span>
Partenaire pn
<span class="hljs-keyword">ON</span>
md.pn_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span>
(<span class="hljs-keyword">SELECT</span>
co.valeur,
cd.relation_id
<span class="hljs-keyword">FROM</span>
Configuration co
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span>
Configuration disponible cd
<span class="hljs-keyword">ON</span>
co.cd_id <span class="hljs-operator">=</span> cd.id
<span class="hljs-keyword">AND</span> cd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
) ct
<span class="hljs-keyword">ON</span>
ct.relation_id <span class="hljs-operator">=</span> pn.id
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span>
Titulaire ti
<span class="hljs-keyword">ON</span>
md.ti_id <span class="hljs-operator">=</span> ti.id
<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span>
(<span class="hljs-keyword">SELECT</span>
<span class="hljs-operator">*</span>
<span class="hljs-keyword">FROM</span>
Règle de titulaire rt
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span>
Règle de partenaire rp
<span class="hljs-keyword">ON</span>
rt.rp_id <span class="hljs-operator">=</span> rp.id
<span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span>
Règle disponigle rd
<span class="hljs-keyword">ON</span>
rp.rd_id <span class="hljs-operator">=</span> rd.id
<span class="hljs-keyword">AND</span> rd.name <span class="hljs-operator">=</span> <span class="hljs-string">'…'</span>
) rt
<span class="hljs-keyword">ON</span>
md.id <span class="hljs-operator">=</span> rt.md_id
<span class="hljs-keyword">WHERE</span>
(md.pn_id <span class="hljs-operator">=</span> :partenaireId
<span class="hljs-keyword">OR</span> rule_merchant_id <span class="hljs-operator">=</span> :partenaireId)
<span class="hljs-keyword">AND</span> rt.id <span class="hljs-operator">=</span> :titulaireId
</code></pre></div></div></div>
<p>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 <em>toutes</em> les configurations, alors que j’aurais souhaité n’en avoir qu’une.</p>
<div class="custom-block custom-block-question"><div class="custom-block-heading">Ma question est donc :</div><div class="custom-block-body"><p>Est-ce qu’il y a moyen d’avoir ce que je souhaite en ajoutant des contraintes dans les jointures ou dans le <code>WHERE</code> dans la première requête ?</p></div></div>
<p>Merci d’avance <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>Conseils pour la conception d'une table MySQL, message #2064172019-07-27T18:15:23+02:00AlliageSphere/@AlliageSpherehttps://zestedesavoir.com/forums/sujet/12776/conseils-pour-la-conception-dune-table-mysql/?page=1#p206417<p>Ok, super ! <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>
<p>Je me renseignerai quand même sur les champs JSON, par curiosité.</p>
<p>Merci beaucoup pour tes réponses ainsi que ta confirmation. <img src="/static/smileys/hihi.png" alt="^^" class="smiley"></p>
<p>A bientôt !</p>Conseils pour la conception d'une table MySQL, message #2064132019-07-27T17:21:10+02:00informaticienzero/@informaticienzerohttps://zestedesavoir.com/forums/sujet/12776/conseils-pour-la-conception-dune-table-mysql/?page=1#p206413<p>Oui, ta deuxième table ressemble typiquement à du JSON. Elle est correcte. <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>Conseils pour la conception d'une table MySQL, message #2064112019-07-27T17:00:08+02:00AlliageSphere/@AlliageSpherehttps://zestedesavoir.com/forums/sujet/12776/conseils-pour-la-conception-dune-table-mysql/?page=1#p206411<p>Bonjour !
Je ne sais pas vraiment ce que sont les champs JSON (à part sûrement contenir du JSON).
Je vais regarder à quoi ils servent.
Merci !</p>
<p>Edit : Mais en soit, est-ce que mon second exemple de table est correct ?</p>Conseils pour la conception d'une table MySQL, message #2064102019-07-27T16:52:06+02:00informaticienzero/@informaticienzerohttps://zestedesavoir.com/forums/sujet/12776/conseils-pour-la-conception-dune-table-mysql/?page=1#p206410<p>Sinon, je sais que la plupart des SGBD aujourd’hui peuvent stocker des champs JSON. Peut-être que ça répond à ton problème ? </p>Conseils pour la conception d'une table MySQL, message #2064042019-07-26T22:55:31+02:00AlliageSphere/@AlliageSpherehttps://zestedesavoir.com/forums/sujet/12776/conseils-pour-la-conception-dune-table-mysql/?page=1#p206404<p>Bonjour !</p>
<p>Oops… Je suis désolé.</p>
<p>En fait, j’ai déjà un certain nombre de tables déjà créées. <img src="/static/smileys/rouge.png" alt=":honte:" class="smiley"></p>
<p>Sinon, le reste de la base de données semble bien fonctionner.</p>
<p>Par contre, ta réponse m’aura permise de découvrir "Redis". Je vais voir ce que c’est. Ça m’intéresse. <img src="/static/smileys/hihi.png" alt="^^" class="smiley"></p>
<p>En tout cas, merci pour ta réponse !</p>Conseils pour la conception d'une table MySQL, message #2064032019-07-26T22:51:11+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/12776/conseils-pour-la-conception-dune-table-mysql/?page=1#p206403<p>Dans ton cas une base de données clés-valeurs, par exemple Redis, serait sans doute plus appropriée qu’une base de données SQL. <img src="/static/smileys/clin.png" alt=";)" class="smiley"></p>Conseils pour la conception d'une table MySQL, message #2063762019-07-26T12:07:09+02:00AlliageSphere/@AlliageSpherehttps://zestedesavoir.com/forums/sujet/12776/conseils-pour-la-conception-dune-table-mysql/?page=1#p206376<p>Bonjour à toutes et à tous !</p>
<p>Je suis actuellement en train de créer une base de données sous MySQL. J’ai un tout petit soucis. En fait, j’hésite entre deux façons de faire ma table. Et je ne sais pas si cette deuxième façon est très "propre".</p>
<p>je souhaite stocker quelques paramètres dans ma table tels que : la version du schémas de ma base de données ainsi que l’adresse IPV4 du routeur et peut-être que d’autres paramètres seront ajoutés.
Ou alors il faudrait que je m’assure que la table ne contienne toujours qu’une seule ligne…mais c’est peut-être compliqué à gérer.</p>
<p>Voici la façon de faire numéro 1 :</p>
<div class="table-wrapper"><table>
<thead>
<tr>
<th>db_version</th>
<th>router_ipv4</th>
<th>…</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table></div>
<p>Une colonne est créée pour chaque paramètre.
Le problème, c’est que l’on peut insérer autant de versions de base de données et d’IPV4 que l’on souhaite.</p>
<p>Donc j’ai pensé à la solution numéro 2 :</p>
<div class="table-wrapper"><table>
<thead>
<tr>
<th>data_key</th>
<th>value</th>
</tr>
</thead>
<tbody>
<tr>
<td>db_version</td>
<td>1.10</td>
</tr>
<tr>
<td>ipv4</td>
<td>0.0.0.0</td>
</tr>
<tr>
<td>autre</td>
<td>valeur</td>
</tr>
</tbody>
</table></div>
<p>Donc du coup, on ajoute aucune nouvelle colonne (aucune modification du schémas de la base de données), on utilise juste la table comme une sorte de tableau associatif.
Ainsi, il n’y aura pas deux versions de base de données qui pourront être créées.</p>
<p>Voilà. C’est peut-être une question bête, mais je serais très content d’avoir vos avis sur la meilleure façon de faire (peut-être une autre encore ?).</p>
<p>Je vous remercie par avance,
Cordialement,
AlliageSphere</p>liste des données , message #1719832018-01-18T22:38:33+01:00viki53/@viki53https://zestedesavoir.com/forums/sujet/10148/liste-des-donnees/?page=1#p171983<p>Commence par afficher l’erreur que te retourne le serveur SQL, ça t’aidera peut-être à constituer la requête qu’il te faut. </p>
<p>Vois du côté de <code>[PDO::errorInfo()](https://secure.php.net/manual/fr/pdo.errorinfo.php)</code> pour l’afficher <img alt=";)" src="/static/smileys/clin.png"> </p>liste des données , message #1719622018-01-18T19:25:50+01:00MariamSifa/@MariamSifahttps://zestedesavoir.com/forums/sujet/10148/liste-des-donnees/?page=1#p171962<p>Effectivement, je pense que le problème est dans la requête sql; j’ai essayé les deux formes avec les variables et avec les points d’interrogation mais je trouve toujours le même problème. mon but est d’afficher toutes les réclamations (messages) faites par le patient connectée(utilisateur) sauf que les données ne sont pas tous dans la même table. <br>
Merci pour votre réponses <img alt=":)" src="/static/smileys/smile.png"></p>liste des données , message #1719612018-01-18T19:15:59+01:00viki53/@viki53https://zestedesavoir.com/forums/sujet/10148/liste-des-donnees/?page=1#p171961<p>Effectivement, tu essaie de faire une requête préparée (c’est très bien) mais sans faire appel à <code>PDO::prepare</code>. Forcément il manque quelque chose.</p>
<p>Sinon, pense à vérifier que tes variables existent et apprends à <a href="https://secure.php.net/manual/fr/language.exceptions.php">gérer les exceptions</a>, ça te permettra d’avoir plus d’infos sur ce qui pose problème la prochaine fois. <img alt=";)" src="/static/smileys/clin.png"> </p>liste des données , message #1719582018-01-18T18:55:19+01:00Helmasaur/@Helmasaurhttps://zestedesavoir.com/forums/sujet/10148/liste-des-donnees/?page=1#p171958<p>Je précise tout d’abord que ça fait longtemps que je n’ai pas fait de PDO.</p>
<p>Ensuite, je pense que le problème vient des points d’interrogation de la ligne 9. Il faut transmettre la valeur que va prendre <em>nom</em> et <em>cin</em>.</p>liste des données , message #1719562018-01-18T18:41:33+01:00MariamSifa/@MariamSifahttps://zestedesavoir.com/forums/sujet/10148/liste-des-donnees/?page=1#p171956<p>SVP je veux afficher les données d’une réclamation qui concerne un patient, je saisie ce code mais il me donne erreur Fatal error: Call to a member function fetchAll() on boolean </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="cp"><?php</span>
<span class="k">include</span><span class="p">(</span><span class="s2">"basededonnee.php"</span><span class="p">);</span>
<span class="nv">$nom</span> <span class="o">=</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s1">'nom'</span><span class="p">];</span>
<span class="nv">$cin</span> <span class="o">=</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s1">'cin'</span><span class="p">];</span>
<span class="nv">$query</span><span class="o">=</span><span class="s2">"SELECT objet,commentaire,nom_service, reclamation.id_service, service.id_service, patient.id_patient, reclamation.id_patient</span>
<span class="s2"> FROM `reclamation`, `service`,`patient`</span>
<span class="s2"> WHERE reclamation.id_service = service.id_service</span>
<span class="s2"> AND reclamation.id_patient = patient.id_patient</span>
<span class="s2"> AND nom =? AND cin =?"</span><span class="p">;</span>
<span class="nv">$stat</span><span class="o">=</span> <span class="nv">$bdd</span><span class="o">-></span><span class="na">query</span><span class="p">(</span><span class="nv">$query</span><span class="p">);</span>
<span class="nv">$tab</span><span class="o">=</span> <span class="nv">$stat</span><span class="o">-></span><span class="na">fetchAll</span><span class="p">();</span>
<span class="k">foreach</span><span class="p">(</span><span class="nv">$tab</span> <span class="k">AS</span> <span class="nv">$row</span><span class="p">){</span>
<span class="k">echo</span><span class="s1">' </span>
<span class="s1"> <div class="clr"></div></span>
<span class="s1"> <div class="comment"> <a href="#"><img src="images/letter.png" width="40" height="40" alt="" class="userpic" /></a></span>
<span class="s1"> <p> '</span><span class="o">.</span><span class="nv">$row</span><span class="p">[</span><span class="s1">'objet'</span><span class="p">]</span><span class="o">.</span><span class="s1">'<br/></span>
<span class="s1"> '</span><span class="o">.</span><span class="nv">$row</span><span class="p">[</span><span class="s1">'nom_service'</span><span class="p">]</span><span class="o">.</span><span class="s1">'</p></span>
<span class="s1"> <p>'</span><span class="o">.</span><span class="nv">$row</span><span class="p">[</span><span class="s1">'commentaire'</span><span class="p">]</span><span class="o">.</span><span class="s1">'</p></div></span>
<span class="s1"> '</span><span class="p">;</span>
<span class="p">}</span>
<span class="cp">?></span><span class="x"></span>
</pre></div>
</td></tr></table></div>mysql qui plante sauvagement, message #412122015-01-27T09:47:14+01:00Eskimon/@Eskimonhttps://zestedesavoir.com/forums/sujet/2308/mysql-qui-plante-sauvagement/?page=1#p41212<blockquote>
<p>Tu as peut-être une erreur de configuration dans un coin.</p>
</blockquote>
<p>Surtout que j'ai peu ou prou laissé la config par défaut…</p>mysql qui plante sauvagement, message #412092015-01-27T09:35:41+01:00SpaceFox/@SpaceFoxhttps://zestedesavoir.com/forums/sujet/2308/mysql-qui-plante-sauvagement/?page=1#p41209<p>Une fois qu'il tournera depuis un moment (au moins 48h), lance un coup de mysqltuner. Tu as peut-être une erreur de configuration dans un coin.</p>