tag:forum.selfhtml.org,2005:/self Mehrfachabfrage in einer mysql Tabelle, doppelte Ergebnisse – SELFHTML-Forum 2022-03-11T12:22:44Z https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797222#m1797222 Hennak 2022-03-10T11:34:38Z 2022-03-10T12:17:46Z Mehrfachabfrage in einer mysql Tabelle, doppelte Ergebnisse <p>Irgendwie ist bei mir da der totale Wurm drin.</p> <pre><code class="block">id !ebene! name 1 ! 1 ! Niedersachsen 2 ! 2 ! Hannover 3 ! 2 ! Hildesheim 4 ! 2 ! Göttingen 5 ! 1 ! Thüringen </code></pre> <p>So werden alle Orte aus Niedersachsen ausgegeben.</p> <pre><code class="block">SELECT ebene, name FROM city WHERE ebene = 2 ORDER BY name ASC; </code></pre> <p>Und so sollten zur Stadt noch der Eintrag Land dazukommen</p> <pre><code class="block">SELECT a.ebene, a.name, b.name AS land FROM city a LEFT JOIN city b ON b.ebene =1 WHERE a.ebene = 2; </code></pre> <p>Bei mir werden aber alle Städte mehrfach ausgegeben. Nämlich mit allen Ländern. In meinem Beispiel</p> <p>Hannover Niedersachsen Hannover Thüringen Hildesheim Niedersachsen Hildesheim Thüringen</p> <p>Weis jemand was da falsch läuft?</p> <p>Hennak</p> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797226#m1797226 Rolf B 2022-03-10T12:29:33Z 2022-03-10T12:29:33Z Mehrfachabfrage in einer mysql Tabelle, doppelte Ergebnisse <p>Hallo Hennak,</p> <blockquote> <p>Weis jemand was da falsch läuft?</p> </blockquote> <p>Ja. Deine Datenbank enthält keine Information über die Beziehung zwischen Land und Stadt. Deine SQL Abfrage liefert ein kartesisches Produkt aller Ebene-1 Objekte mit den Ebene-2 Objekten.</p> <blockquote> <p>So werden alle Orte aus Niedersachsen ausgegeben.</p> </blockquote> <pre><code class="block bad language-sql"><span class="token keyword">SELECT</span> ebene<span class="token punctuation">,</span> name <span class="token keyword">FROM</span> city <span class="token keyword">WHERE</span> ebene <span class="token operator">=</span> <span class="token number">2</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> name <span class="token keyword">ASC</span><span class="token punctuation">;</span> </code></pre> <p><strong>NEIN</strong>. So werden alle Orte ausgegeben. Egal in welchem Bundesland. Deine Tabelle enthält derzeit nur Orte aus Niedersachsen, deswegen scheint es zu funktionieren. Aber füge mal Erfurt und Jena hinzu.</p> <p>Also - irgendwie muss Hannover "wissen", dass es zu Niedersachsen gehört, und Erfurt, dass es zu Thüringen gehört. Dieses Wissen musst Du der Tabelle hinzufügen und in der ON-Klausel der SQL Query nutzen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797229#m1797229 Raketenwilli 2022-03-10T12:44:07Z 2022-03-10T12:53:49Z Inner-Join, Tabelle unvollständig <blockquote> <p>Weis jemand was da falsch läuft?</p> </blockquote> <p>Ja. Viel.</p> <p>Zuerst hat Deine Tabelle ein Problem. Es fehlt eine Beziehung zwischen den Orten und dem Land. Ich habe eine Spalte "parent" hinzugefügt, dann auch noch Erfurt in Thüringen damit der Effekt sichtbar wird:</p> <pre><code class="block language-sql"><span class="token keyword">BEGIN</span> <span class="token keyword">TRANSACTION</span><span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> <span class="token keyword">IF</span> <span class="token operator">NOT</span> <span class="token keyword">EXISTS</span> <span class="token string">"orte"</span> <span class="token punctuation">(</span> <span class="token string">"id"</span> <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> <span class="token string">"parent"</span> <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> <span class="token string">"ebene"</span> <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> <span class="token string">"name"</span> <span class="token keyword">TEXT</span><span class="token punctuation">,</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token string">"orte"</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token boolean">NULL</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token string">'Niedersachsen'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token string">"orte"</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token string">'Hannover'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token string">"orte"</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token string">'Hildesheim'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token string">"orte"</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token string">'Göttingen'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token string">"orte"</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token boolean">NULL</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token string">'Thüringen'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token string">"orte"</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token string">'Erfurt'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">COMMIT</span><span class="token punctuation">;</span> </code></pre> <p>Die Abfrage geht dann via <strong>inner</strong> Join</p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> a<span class="token punctuation">.</span>name <span class="token keyword">as</span> City<span class="token punctuation">,</span> b<span class="token punctuation">.</span>name <span class="token keyword">AS</span> Country <span class="token keyword">FROM</span> orte <span class="token keyword">AS</span> a<span class="token punctuation">,</span> orte <span class="token keyword">AS</span> b <span class="token keyword">WHERE</span> a<span class="token punctuation">.</span>parent <span class="token operator">=</span> b<span class="token punctuation">.</span>id </code></pre> <p>liefert (die von mir) erwartete Tabelle mit allen Städten und den dazu gehörenden Bundesländern.</p> <p>Zur weiteren Eingrenzung kannst Du dann ETWAS wie</p> <pre><code class="block language-sql"><span class="token operator">AND</span> City<span class="token operator">=</span><span class="token string">"Erfurt"</span> </code></pre> <p>oder</p> <pre><code class="block language-sql"><span class="token operator">AND</span> Country<span class="token operator">=</span><span class="token string">"Niedersachsen"</span> </code></pre> <p>zur where-Clausel hinzufügen.</p> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797250#m1797250 Kurt 2022-03-11T08:52:46Z 2022-03-11T08:52:46Z Mehrfachabfrage in einer mysql Tabelle, doppelte Ergebnisse <p>Hallo,</p> <blockquote> <p>Also - irgendwie muss Hannover "wissen", dass es zu Niedersachsen gehört, und Erfurt, dass es zu Thüringen gehört.</p> </blockquote> <p>Sinnvollerweise würde ich das auch nicht in dieselbe Tabelle schreiben. Eine Tabelle "Bundesländer" zu einer Tabelle "Staedte" (eigentlich sogar nebst Zuordnungstabelle) klingt für mich sinnvoll und auch "normalisiert".</p> <p>Kurt</p> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797236#m1797236 MudGuard http://www.andreas-waechter.de/ 2022-03-10T17:04:02Z 2022-03-10T17:04:02Z Inner-Join, Tabelle unvollständig <p>Hi,</p> <blockquote> <p>Zur weiteren Eingrenzung kannst Du dann ETWAS wie</p> <pre><code class="block language-sql"><span class="token operator">AND</span> City<span class="token operator">=</span><span class="token string">"Erfurt"</span> </code></pre> <p>oder</p> <pre><code class="block language-sql"><span class="token operator">AND</span> Country<span class="token operator">=</span><span class="token string">"Niedersachsen"</span> </code></pre> <p>zur where-Clausel hinzufügen.</p> </blockquote> <p>columns not found.</p> <p>Es müßte auf <code>name = ...</code> abgefragt werden, und das wäre dann nicht eindeutig, weil's ja sowohl in a als auch in b eine name-Spalte gibt.</p> <p>Es müßte also für Stadt <code>a.name = ...</code> und für's Land <code>b.name = ...</code> sein.</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797239#m1797239 Raketenwilli 2022-03-10T21:52:09Z 2022-03-10T21:52:09Z Inner-Join, Tabelle unvollständig <blockquote> <p>Hi,</p> <blockquote> <p>Zur weiteren Eingrenzung kannst Du dann ETWAS wie</p> <pre><code class="block language-sql"><span class="token operator">AND</span> City<span class="token operator">=</span><span class="token string">"Erfurt"</span> </code></pre> <p>oder</p> <pre><code class="block language-sql"><span class="token operator">AND</span> Country<span class="token operator">=</span><span class="token string">"Niedersachsen"</span> </code></pre> <p>zur where-Clausel hinzufügen.</p> </blockquote> <p>columns not found.</p> </blockquote> <p>Dann hast Du etwas anders gemacht als ich:</p> <p><a href="/images/25334152-a0bc-11ec-b8b5-b42e9947ef30.png" rel="noopener noreferrer"><img src="/images/25334152-a0bc-11ec-b8b5-b42e9947ef30.png?size=medium" alt="" loading="lazy"></a></p> <p>(Sqlite3) - Hast Du womöglich GROSS/klein vertan?</p> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797241#m1797241 Rolf B 2022-03-10T22:36:46Z 2022-03-10T22:36:46Z Inner-Join, Tabelle unvollständig <p>Hallo Raketenwilli,</p> <p>erstaunlich, dass man in einem WHERE auf die Aliasnamen im SELECT Bezug nehmen können soll.</p> <p>Mein Datenmariechen der Version 10.5.9 kann's jedenfalls nicht, und ich hab auch nichts anderes erwartet. MySQL wird es nicht anders machen, und ein SQLite habe ich gerade nicht am Start.</p> <p>Aliasnamen werden erst ganz am Schluss vergeben, EIGENTLICH sogar erst nach dem ORDER BY. Ich arbeite primär mit DB2 und MS SQL Server, dort kann man weder im GROUP BY noch im ORDER BY Bezug auf Aliasnamen nehmen.</p> <p>An der Stelle weichen MYSQL/MariaDB ab, die vergeben die Aliasnamen bereits vor dem GROUP BY. Aber nicht früher; im WHERE gibt es sie noch nocht.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797266#m1797266 MudGuard http://www.andreas-waechter.de/ 2022-03-11T12:22:44Z 2022-03-11T12:22:44Z Inner-Join, Tabelle unvollständig <p>Hi,</p> <blockquote> <p>Dann hast Du etwas anders gemacht als ich:</p> </blockquote> <p>Ich hab den Betreff des Original-Postings beachtet.</p> <p>Nix Sqlite3, sondern MySQL.</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797243#m1797243 Raketenwilli 2022-03-11T00:22:50Z 2022-03-11T00:26:38Z „Structured“ vers. „Standarded“ + Geografie <blockquote> <p>erstaunlich, dass man in einem WHERE auf die Aliasnamen im SELECT Bezug nehmen können soll.</p> </blockquote> <p>Ich empfinde das nicht <em>„erstaunlich“</em> sondern als <em>„konsequent“</em> und in sqlite3 geht es. Es sei denn der sqlitebrowser „übersetzt“ das SQL.</p> <p>Geht also. Geht also ebenso nicht. In MariaDB kann ich nicht mal das gezeigte Skript zur Erstellung der Tabelle ausführen… Wodurch dann klar wird, warum es <em>„Structured Query Language“</em> statt <em>„Standarded Query Language“</em> heißt.</p> <p>Gut, dass ich</p> <p><a href="/images/87200202-a0cf-11ec-a2cd-b42e9947ef30.png" rel="noopener noreferrer"><img src="/images/87200202-a0cf-11ec-a2cd-b42e9947ef30.png?size=medium" alt="" loading="lazy"></a></p> <p>notiert habe. </p> <p>Nicht des zu trotz ändert das nichts daran, dass hier ein Inner Join her muss und im Original die Spalte für die Zuordnung zur „übergeordneten Gebietskörperschaft“ fehlt.</p> <p>Aber: Es gibt in Hinblick auf denkbare Erweiterungen (und <a href="https://de.wikipedia.org/wiki/Exklave" rel="nofollow noopener noreferrer">Exklaven</a>) den Gedanke daran, dass eine derart hierarchische Zuordnung nicht in jedem Fall sinnvoll ist. Frankreich z.B. liegt nach allgemeiner Ansicht zwar in Europa - <a href="https://de.wikipedia.org/wiki/%C3%9Cbersee-D%C3%A9partement" rel="nofollow noopener noreferrer">das gilt aber nicht für jeden Ort Frankreichs</a>.</p> <p>Aus solchen Gründen würde ich dazu raten, die Länder in eine eigene Tabelle zu packen. Das lässt sich später auch besser bearbeiten.</p> <blockquote> <p>ein SQLite habe ich gerade nicht am Start</p> </blockquote> <p>Hm. Das brauch ich immer öfter… und es ist nicht viel (ein paar MB). Firefox nutzt es z.B. im Profil.</p> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797246#m1797246 Rolf B 2022-03-11T07:59:06Z 2022-03-11T08:01:00Z „Structured“ vers. „Standarded“ + Geografie <p>Hallo Raketenwilli,</p> <blockquote> <p>Nicht des zu trotz ändert das nichts daran, dass hier ein Inner Join her muss und im Original die Spalte für die Zuordnung zur „übergeordneten Gebietskörperschaft“ fehlt.</p> </blockquote> <p>Das ist unbestritten, und ich schrieb es gestern schon eine Viertelstunde früher als du </p> <blockquote> <p>hierarchische Zuordnung nicht in jedem Fall sinnvoll</p> </blockquote> <p>Das stimmt auch. Aber wenn jemand von sich aus nicht drauf kommt, dass eine 1:n Zuordnung fehlt, dann überrolle ich ihn nicht gleich mit einer m:n Relationstabelle. Bislang fehlt jeder Mucks von Hennak, ob ihrm<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> das geholfen hat.</p> <blockquote> <p>Das lässt sich später auch besser bearbeiten.</p> </blockquote> <p>Dem würde ich widersprechen. Die Pflege einer m:n Relationstabelle ist deutlich aufwändiger - unter anderem, weil auch der fachliche Sachverhalt komplexer ist. Und man muss 2 Tabellen manipulieren, nicht nur eine. Deswegen würde ich so etwas nicht ohne Not konstruieren.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>Pronomenvorschlag 3. Person Neutral: sier (<strong>si</strong>e+<strong>er</strong>), sihn (<strong>s</strong>ei<strong>n</strong>+<strong>ih</strong>r), ihrm (ihm+ihr), sier (sie+er) <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section> https://forum.selfhtml.org/self/2022/mar/10/mehrfachabfrage-in-einer-mysql-tabelle-doppelte-ergebnisse/1797255#m1797255 Rolf B 2022-03-11T10:12:09Z 2022-03-11T10:12:09Z Mehrfachabfrage in einer mysql Tabelle, doppelte Ergebnisse <p>Hallo Kurt,</p> <p>das hängt von den Anforderungen ab. Wenn ich eine hierarchische Struktur ähnlicher Objekte habe, kann man das auch in eine gemeinsame Tabelle packen. Das muss man im Einzelfall genau betrachten.</p> <p>Vor allem, wenn die Struktur nicht homogen ist. Eigene Tabellen für jeden Typ von Gebietskörperschaft könnten die Navigation in der Datenbank erschweren.</p> <p><a href="/images/86f638e2-a123-11ec-9787-b42e9947ef30.png" rel="noopener noreferrer"><img src="/images/86f638e2-a123-11ec-9787-b42e9947ef30.png?size=medium" alt="" loading="lazy"></a></p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div>