tag:forum.selfhtml.org,2005:/self verschiedene Kategorien in einer SELECT Abfrage zählen (addieren) – SELFHTML-Forum 2020-06-23T17:37:33Z https://forum.selfhtml.org/self/2020/jun/23/verschiedene-kategorien-in-einer-select-abfrage-zahlen-addieren/1772506#m1772506 Ludwig II 2020-06-23T14:46:00Z 2020-06-23T14:46:00Z verschiedene Kategorien in einer SELECT Abfrage zählen (addieren) <p>Hallo, ich fange gerade an mich mit mysql zu beschäftigen.</p> <p>Jetzt habe ich zwei Tabellen angelegt, ein davon hat die Kategorien und in der anderen sind meine Daten.</p> <p>Jetzt würde ich gerne eine Abfrage starten und alle meine Daten zählen in Bezug auf die Kategorie.</p> <p><strong>Id Titel kat</strong></p> <p>1.inhalt.1</p> <p>2.inhalt.1</p> <p>3.inhalt.1</p> <p>4.inhalt.2</p> <p>5.inhalt.2</p> <p>6.inhalt.2</p> <p>Ich kann zwar alle Datensätze zählen und mit WHERE die einzelnen Kategorien filtern, aber dann müsste ich ja 3-mal ein Zählvorgang starten und wenn es eine weitere Kategorie gibt, noch einen.</p> <p>SELECT count(*) AS total FROM tab_inhalt</p> <p>Kann man nicht mit einer einzigen Abfrage alle Kategorien zählen</p> https://forum.selfhtml.org/self/2020/jun/23/verschiedene-kategorien-in-einer-select-abfrage-zahlen-addieren/1772507#m1772507 Rolf B 2020-06-23T14:50:27Z 2020-06-23T14:50:27Z verschiedene Kategorien in einer SELECT Abfrage zählen (addieren) <p>Hallo Ludwig,</p> <blockquote> <p>Kann man nicht mit einer einzigen Abfrage alle Kategorien zählen</p> </blockquote> <p>Doch, das kann man, mit der <a href="https://wiki.selfhtml.org/wiki/Datenbank/SQL-Grundlagen#GROUP_BY_-_Bilden_von_Teilmengen" rel="nofollow noopener noreferrer">GROUP BY</a> Klausel.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/jun/23/verschiedene-kategorien-in-einer-select-abfrage-zahlen-addieren/1772510#m1772510 Felix Riesterer https://felix-riesterer.de 2020-06-23T15:21:45Z 2020-06-23T15:22:08Z verschiedene Kategorien in einer SELECT Abfrage zählen (addieren) <p>Lieber Ludwig,</p> <p>Du willst im Ergebnis doch das stehen haben:</p> <p>kat:1, total:3<br> kat:2, total:3</p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token identifier"><span class="token punctuation">`</span>kategorientabelle<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>kat<span class="token punctuation">`</span></span> <span class="token keyword">AS</span> <span class="token identifier"><span class="token punctuation">`</span>kat<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>titeltabelle<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>kategorientabelle<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>kat<span class="token punctuation">`</span></span> <span class="token operator">=</span> <span class="token identifier"><span class="token punctuation">`</span>titeltabelle<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>kat<span class="token punctuation">`</span></span> <span class="token punctuation">)</span> <span class="token keyword">AS</span> <span class="token identifier"><span class="token punctuation">`</span>total<span class="token punctuation">`</span></span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>kategorientabelle<span class="token punctuation">`</span></span> </code></pre> <p>Das ist jetzt ungetestet, zeigt aber, wohin die Reise gehen könnte.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2020/jun/23/verschiedene-kategorien-in-einer-select-abfrage-zahlen-addieren/1772514#m1772514 Rolf B 2020-06-23T17:37:33Z 2020-06-23T17:37:33Z verschiedene Kategorien in einer SELECT Abfrage zählen (addieren) <p>Hallo Felix,</p> <p>okay - das hatte ich nicht bedacht. Was ist, wenn in der Kategorientabelle eine Kategorie steht, die in der Datentabelle keine Einträge hat.</p> <p>Das ist jetzt der alte Streit Subselect vs Join, den ich gerne schüren möchte . Deine Query führt einen COUNT pro Kategorie durch, d.h. bei 100 Kategorien 100 COUNTs.</p> <p>Man müsste es im real live mit großen Tabellen messen, aber eigentlich sollte für solche Aufgaben der LEFT JOIN optimiert sein. Ich gehe jetzt von einem Modell aus, wo Kategorien- und Datentabelle eine id-Spalte haben und in den Daten die kat_id als Fremdschlüssel steht.</p> <p>Für die Gruppierung reicht eigentlich die id-Spalte der Kategorien-Tabelle aus. Aber formal muss eine nicht aggregierte Spalte, die im SELECT auszugeben ist, im Group By gelistet sein. Und wer weiß, ob der Name eindeutig ist...</p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> kategorien<span class="token punctuation">.</span>id <span class="token keyword">as</span> KatId<span class="token punctuation">,</span> kategorien<span class="token punctuation">.</span>name <span class="token keyword">as</span> Kategorie<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>daten<span class="token punctuation">.</span>id<span class="token punctuation">)</span> <span class="token keyword">as</span> Anzahl <span class="token keyword">FROM</span> kategorien <span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> daten <span class="token keyword">ON</span> kategorien<span class="token punctuation">.</span>id <span class="token operator">=</span> daten<span class="token punctuation">.</span>kat_id <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> kategorien<span class="token punctuation">.</span>id<span class="token punctuation">,</span> kategorien<span class="token punctuation">.</span>kat </code></pre> <p>Der Left Join erzeugt für Kategorien, die keine Daten haben, NULL-Werte für die Spalten der Datentabelle. Und COUNT(feldname) zählt Rows, wo das angegebene Feld null ist, nicht mit. Da die id der Daten in der DB sicherlich nie null ist, kann man auf diese Weise für unbelegte Kategorien eine 0 bekommen.</p> <p>Beide Queries, mit Subselect oder mit Left Join, setzen voraus dass die Datentabelle einen Index hat, in dem die Kategorie-ID die erste Spalte ist. Andernfalls wird es bei größeren Datenmengen sehr langsam.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div>