tag:forum.selfhtml.org,2005:/selfKeine Ausgabe - komplizierte Abfrage – SELFHTML-Forum2019-05-29T06:48:02Zhttps://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749388#m1749388Bernd2019-05-26T15:44:21Z2019-05-26T15:44:21ZKeine Ausgabe - komplizierte Abfrage<p>Hallo,</p>
<p>ich habe ein wenig Probleme mit meinem Script. Wenn ich dieses in phpMyAdmin ausführe erhalte ich keine Einträge, obwohl laut Datenbank welche vorhanden sein müssen und zwar für den heutigen Tag 5</p>
<pre><code class="block language-php"><span class="token constant">SELECT</span>
kp_id<span class="token punctuation">,</span> kp_code<span class="token punctuation">,</span> kp_userID<span class="token punctuation">,</span> kp_status<span class="token punctuation">,</span> kt_kalenderID<span class="token punctuation">,</span> kt_datum<span class="token punctuation">,</span> k_code<span class="token punctuation">,</span> k_jobNr<span class="token punctuation">,</span>
k_bezeichnung<span class="token punctuation">,</span> ka_code<span class="token punctuation">,</span> ka_titel<span class="token punctuation">,</span> ka_farbe
<span class="token constant">FROM</span> kalender_personal
<span class="token constant">LEFT</span> <span class="token constant">JOIN</span>
kalender_termine <span class="token constant">ON</span> kalender_termine<span class="token operator">.</span>kt_datum <span class="token operator">=</span> kalender_personal<span class="token operator">.</span>kp_code
<span class="token constant">LEFT</span> <span class="token constant">JOIN</span>
kalender <span class="token constant">ON</span> kalender<span class="token operator">.</span>k_code <span class="token operator">=</span> kalender_personal<span class="token operator">.</span>kp_code
<span class="token constant">LEFT</span> <span class="token constant">JOIN</span>
kalender_arten <span class="token constant">ON</span> kalender_arten<span class="token operator">.</span>ka_code <span class="token operator">=</span> kalender_personal<span class="token operator">.</span>kp_code
<span class="token constant">WHERE</span>
kt_datum <span class="token operator">=</span> <span class="token string single-quoted-string">'2019-05-26'</span>
<span class="token constant">ORDER</span> by test <span class="token constant">ASC</span>
</code></pre>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749389#m1749389dedlfix2019-05-26T15:55:15Z2019-05-26T15:55:15ZKeine Ausgabe - komplizierte Abfrage<p>Tach!</p>
<blockquote>
<p>ich habe ein wenig Probleme mit meinem Script. Wenn ich dieses in phpMyAdmin ausführe erhalte ich keine Einträge, obwohl laut Datenbank welche vorhanden sein müssen und zwar für den heutigen Tag 5</p>
</blockquote>
<p>Ohne die Tabellenstrukturen zu kennen und ohne Testdaten kann ich nur Allgemeines zur Vorgehensweise sagen. Lass zuerst mal das WHERE weg und schau dir an, was überhaupt für eine Datenmenge erzeugt wird. Wenn das keine Erkenntnisse bringt, bau die Query schrittweise auf. Ein Join nach dem anderen hinzufügen und immer die erzeugte Ergebnismenge anschauen.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749392#m1749392Rolf B2019-05-26T16:11:53Z2019-05-26T16:11:53ZKeine Ausgabe - komplizierte Abfrage<p>Hallo Bernd,</p>
<p>ergänzend zu Dedlfix:</p>
<p>Welchen Datentyp hat die Spalte kt_datum? Vielleicht hast Du das früher mal geschrieben, aber das merken wir uns nicht unbedingt </p>
<p>Die LEFT JOINs reduzieren nicht die Ergebnismenge und können darum nicht an den 0 Treffern schuld sein. Es muss der WHERE sein, und ich würde mal vermuten: kt_datum ist ein DATETIME-Wert. In dem Fall musst Du einen Bereich abfragen: kt_datum >= '2019-05-26' AND kt_datum < '2019-05-27'</p>
<p>Das ist natürlich blöd, wenn das abzufragende Datum aus einer Variablen kommen soll. Was Du aber keinesfalls tun solltest, ist dies:</p>
<pre><code class="block bad language-sql"><span class="token keyword">SELECT</span> kp_id<span class="token punctuation">,</span> kp_code<span class="token punctuation">,</span> kp_userID<span class="token punctuation">,</span> kp_status<span class="token punctuation">,</span> kt_kalenderID<span class="token punctuation">,</span> kt_datum<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token keyword">FROM</span> kalender_personal
<span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token keyword">WHERE</span> <span class="token keyword">DATE</span><span class="token punctuation">(</span>kt_datum<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token string">'2019-05-26'</span>
</code></pre>
<p>Das wird zwar funktionieren, ist aber ineffizient, weil MYSQL dann einen Table Scan macht. Bestenfalls einen Index-Scan (wenn kt_datum im Index ist).</p>
<p>Besser ist es, in PHP das Datum des Folgetages zu bestimmen und damit die Bereichsabfrage zu bauen.</p>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - clusi
</div>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749394#m1749394Bernd2019-05-26T16:18:16Z2019-05-26T16:18:16ZKeine Ausgabe - komplizierte Abfrage<p>Hallo,</p>
<p>danke für deine Antwort. Wenn ich das WHERE weg lasse erhalte ich knapp 1.300 Einträge. Kann stimmen. Was mir jetzt auffällt ist, im Feld kt_kalenderID, kt_datum, ka_code, ka_titel und ka_farbe steht NULL.</p>
<p>Zum Verständnis, ich möchte alle User auslesen, die für ein bestimmtes Datum eingetragen sind.</p>
<p>Die Tabelle sehen wie folgt aus</p>
<pre><code class="block language-sql"><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 identifier"><span class="token punctuation">`</span>kalender_personal<span class="token punctuation">`</span></span> <span class="token punctuation">(</span>
<span class="token identifier"><span class="token punctuation">`</span>kp_id<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">AUTO_INCREMENT</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>kp_code<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>kp_userID<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>kp_positionID<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>kp_status<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token string">'0'</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 identifier"><span class="token punctuation">`</span>kp_id<span class="token punctuation">`</span></span><span class="token punctuation">)</span>
<span class="token punctuation">)</span> <span class="token keyword">ENGINE</span><span class="token operator">=</span>MyISAM <span class="token keyword">DEFAULT</span> <span class="token keyword">CHARSET</span><span class="token operator">=</span>latin1 <span class="token keyword">AUTO_INCREMENT</span><span class="token operator">=</span><span class="token number">1805</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 identifier"><span class="token punctuation">`</span>kalender_termine<span class="token punctuation">`</span></span> <span class="token punctuation">(</span>
<span class="token identifier"><span class="token punctuation">`</span>kt_id<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">AUTO_INCREMENT</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>kt_kalenderID<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>kt_datum<span class="token punctuation">`</span></span> <span class="token keyword">date</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>test<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</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 identifier"><span class="token punctuation">`</span>kt_id<span class="token punctuation">`</span></span><span class="token punctuation">)</span>
<span class="token punctuation">)</span> <span class="token keyword">ENGINE</span><span class="token operator">=</span>MyISAM <span class="token keyword">DEFAULT</span> <span class="token keyword">CHARSET</span><span class="token operator">=</span>latin1 <span class="token keyword">AUTO_INCREMENT</span><span class="token operator">=</span><span class="token number">12261</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 identifier"><span class="token punctuation">`</span>kalender<span class="token punctuation">`</span></span> <span class="token punctuation">(</span>
<span class="token identifier"><span class="token punctuation">`</span>k_id<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">AUTO_INCREMENT</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>k_code<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>k_art<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>k_jobNr<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>k_bezeichnung<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>k_grund<span class="token punctuation">`</span></span> <span class="token keyword">text</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>k_farbe<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>k_datum_von<span class="token punctuation">`</span></span> <span class="token keyword">date</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>k_datum_bis<span class="token punctuation">`</span></span> <span class="token keyword">date</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</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 identifier"><span class="token punctuation">`</span>k_id<span class="token punctuation">`</span></span><span class="token punctuation">)</span>
<span class="token punctuation">)</span> <span class="token keyword">ENGINE</span><span class="token operator">=</span>MyISAM <span class="token keyword">DEFAULT</span> <span class="token keyword">CHARSET</span><span class="token operator">=</span>latin1 <span class="token keyword">AUTO_INCREMENT</span><span class="token operator">=</span><span class="token number">1136</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 identifier"><span class="token punctuation">`</span>kalender_arten<span class="token punctuation">`</span></span> <span class="token punctuation">(</span>
<span class="token identifier"><span class="token punctuation">`</span>ka_id<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">AUTO_INCREMENT</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>ka_code<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>ka_titel<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
<span class="token identifier"><span class="token punctuation">`</span>ka_farbe<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</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 identifier"><span class="token punctuation">`</span>ka_id<span class="token punctuation">`</span></span><span class="token punctuation">)</span>
<span class="token punctuation">)</span> <span class="token keyword">ENGINE</span><span class="token operator">=</span>MyISAM <span class="token keyword">DEFAULT</span> <span class="token keyword">CHARSET</span><span class="token operator">=</span>latin1 <span class="token keyword">AUTO_INCREMENT</span><span class="token operator">=</span><span class="token number">10</span> <span class="token punctuation">;</span>
</code></pre>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749396#m1749396Bernd2019-05-26T16:30:32Z2019-05-26T16:30:32ZKeine Ausgabe - komplizierte Abfrage<p>Hallo,</p>
<p>kt_datum ist ein date Feld. Das Datum wird 2019-05-26 gespeichert. Die Strukturen meiner Tabellen habe ich hier gezeigt:</p>
<p><a href="https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749394#m1749394" rel="noopener noreferrer">https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749394#m1749394</a></p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749395#m1749395dedlfix2019-05-26T16:22:30Z2019-05-26T16:22:30ZKeine Ausgabe - komplizierte Abfrage<p>Tach!</p>
<blockquote>
<p>danke für deine Antwort. Wenn ich das WHERE weg lasse erhalte ich knapp 1.300 Einträge. Kann stimmen. Was mir jetzt auffällt ist, im Feld kt_kalenderID, kt_datum, ka_code, ka_titel und ka_farbe steht NULL.</p>
</blockquote>
<p>Warum bei einem Left Join NULL entstehen kann, wenn kein NULL in den Daten steht, ist <a href="https://wiki.selfhtml.org/wiki/Datenbank/Einf%C3%BChrung_in_Joins" rel="nofollow noopener noreferrer">Basiswissen</a>.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749403#m1749403pl2019-05-26T18:16:19Z2019-05-26T18:18:35ZKeine Ausgabe - komplizierte Abfrage<p>Wenn Du NULL kriegst, kann das auch daran liegen daß Dein JOIN falschherumrum (seitenverkehrt) ist. Also mach entweder einen right Join oder nimm die Tabelle kalender_termine als Basistabelle, denn hier ist das feld kt_datum.</p>
<pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">FROM</span> kalender_termine
<span class="token keyword">JOIN</span> kalender_arten usw<span class="token punctuation">.</span>
<span class="token keyword">WHERE</span> kt_datum <span class="token operator">=</span> <span class="token string">'..'</span>
</code></pre>
<p>Und zur Optimierung lege einen Index auf kt_datum. Bei Deinen paar Daten ist er noch nicht nötig, aber das wird noch kommen. MFG</p>
<p>Und arbeite mit aussagekräftigen Alias'n bei Deinen Abfragen!</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749400#m1749400Bernd2019-05-26T16:59:27Z2019-05-26T16:59:27ZKeine Ausgabe - komplizierte Abfrage<p>OK, ich habe die Abfrage etwas umgebaut</p>
<pre><code class="block language-php"><span class="token constant">SELECT</span>
kt_kalenderID<span class="token punctuation">,</span> kt_datum<span class="token punctuation">,</span> kp_id<span class="token punctuation">,</span> kp_code<span class="token punctuation">,</span> kp_userID<span class="token punctuation">,</span> k_code<span class="token punctuation">,</span> k_jobNr<span class="token punctuation">,</span> k_bezeichnung<span class="token punctuation">,</span>
per_anrede<span class="token punctuation">,</span> per_name<span class="token punctuation">,</span> per_vorname
<span class="token constant">FROM</span> kalender_termine
<span class="token constant">LEFT</span> <span class="token constant">JOIN</span>
kalender <span class="token constant">ON</span> kalender<span class="token operator">.</span>k_code <span class="token operator">=</span> kalender_termine<span class="token operator">.</span>kt_kalenderID
<span class="token constant">LEFT</span> <span class="token constant">JOIN</span>
kalender_personal <span class="token constant">ON</span> kalender_personal<span class="token operator">.</span>kp_code <span class="token operator">=</span> kalender_termine<span class="token operator">.</span>kt_kalenderID
<span class="token constant">LEFT</span> <span class="token constant">JOIN</span>
personal <span class="token constant">ON</span> personal<span class="token operator">.</span>per_code <span class="token operator">=</span> kalender_personal<span class="token operator">.</span>kp_userID
<span class="token constant">WHERE</span>
kt_datum <span class="token operator">=</span> <span class="token string single-quoted-string">'2019-05-26'</span>
<span class="token keyword">AND</span> kp_userID <span class="token operator">!=</span> <span class="token string double-quoted-string">""</span>
<span class="token constant">ORDER</span> by test <span class="token constant">ASC</span>
</code></pre>
<p>Jetzt erhalte ich auch eine Ausgabe</p>
<blockquote>
<p>Zeige Datensätze 0 - 10 ( 11 insgesamt, Die Abfrage dauerte 0.0035 Sekunden)</p>
</blockquote>
<p>Scheinbar muss ich eine ganz bestimmte Reihenfolge einhalten wenn ich mit einem Datum arbeite?</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749397#m1749397Tabellenkalk2019-05-26T16:48:06Z2019-05-26T16:48:06ZKeine Ausgabe - komplizierte Abfrage<p>Hallo,</p>
<blockquote>
<p>kt_datum ist ein date Feld.</p>
</blockquote>
<p>Die Frage die sich mir hier stellt: lässt sich ein date-Feld (kt_datum) mit einem varchar-Feld (kp_code) joinen? Vermutlich ist die interne Darstellung eine andere und daher unmöglich…</p>
<p>Gruß<br>
Kalk</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749404#m1749404Rolf B2019-05-26T19:29:16Z2019-05-26T19:29:16ZKeine Ausgabe - komplizierte Abfrage<p>Hallo Bernd,</p>
<p>mir fällt auf, dass deine umgebaute Query anders joined als die Originalquery.</p>
<p>alt: kalender_termine.kt_datum = kalender_personal.kp_code<br>
neu: kalender_personal.kp_code = kalender_termine.kt_kalenderID</p>
<p>Das wird wohl der Hauptgrund dafür sein, dass Du auf einmal Treffer bekommst.</p>
<p>Generell solltest Du noch einen EXPLAIN auf deine neue Query machen und Dir merken. Und dann solltest Du</p>
<ul>
<li>den LEFT JOIN mit kalender_personal nach vorn ziehen (weil Du darauf einen WHERE ansetzt)</li>
<li>das LEFT in diesem LEFT JOIN weglassen, weil Du kp_code != "" abfragst, was Sätze abweist, in denen kp_code NULL ist. Die Sätze, die Du durch einen LEFT JOIN zusätzlich bekommst, werden demnach vom WHERE gleich wieder weggefressen.</li>
</ul>
<p>Also so:</p>
<pre><code class="block language-sql"><span class="token keyword">SELECT</span>
kt_kalenderID<span class="token punctuation">,</span> kt_datum<span class="token punctuation">,</span> kp_id<span class="token punctuation">,</span> kp_code<span class="token punctuation">,</span> kp_userID<span class="token punctuation">,</span> k_code<span class="token punctuation">,</span> k_jobNr<span class="token punctuation">,</span> k_bezeichnung<span class="token punctuation">,</span>
per_anrede<span class="token punctuation">,</span> per_name<span class="token punctuation">,</span> per_vorname
<span class="token keyword">FROM</span> kalender_termine
<span class="token keyword">JOIN</span>
kalender_personal <span class="token keyword">ON</span> kalender_personal<span class="token punctuation">.</span>kp_code <span class="token operator">=</span> kalender_termine<span class="token punctuation">.</span>kt_kalenderID
<span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span>
kalender <span class="token keyword">ON</span> kalender<span class="token punctuation">.</span>k_code <span class="token operator">=</span> kalender_termine<span class="token punctuation">.</span>kt_kalenderID
<span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span>
personal <span class="token keyword">ON</span> personal<span class="token punctuation">.</span>per_code <span class="token operator">=</span> kalender_personal<span class="token punctuation">.</span>kp_userID
<span class="token keyword">WHERE</span>
kt_datum <span class="token operator">=</span> <span class="token string">'2019-05-26'</span>
<span class="token operator">AND</span> kp_userID <span class="token operator">!=</span> <span class="token string">""</span>
<span class="token keyword">ORDER</span> <span class="token keyword">by</span> test <span class="token keyword">ASC</span>
</code></pre>
<p>Du kannst Dich dann auch noch fragen, ob die Beziehung kalender_termine -> kalender tatsächlich optional ist (sprich: ob es kt_kalenderIDs geben kann, zu denen Du keinen k_code findest). Die gleiche Frage wäre für die Beziehung kalender_personal -> personal zu stellen. Wenn die Namen deiner Tabellen gut gewählt sind, würde ich annehmen, dass diese Beziehungen obligatorisch sind. Und dann kann das LEFT da weg.</p>
<p>Nachdem Du unnötige LEFT entfernt hast, solltest Du nochmal einen EXPLAIN machen und gucken ob der gewählte Zugriff besser geworden ist.</p>
<p>Ach ja, natürlich sollten die Spalten kp_code, k_code und per_code in einem Index zu finden sein, damit die JOINs nicht zu Table- oder Index-Scans führen. Aber das weißt Du sicherlich schon.</p>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - clusi
</div>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749399#m1749399dedlfix2019-05-26T16:57:00Z2019-05-26T16:57:00ZKeine Ausgabe - komplizierte Abfrage<p>Tach!</p>
<blockquote>
<p>Die Frage die sich mir hier stellt: lässt sich ein date-Feld (kt_datum) mit einem varchar-Feld (kp_code) joinen? Vermutlich ist die interne Darstellung eine andere und daher unmöglich…</p>
</blockquote>
<p>Das ist ein simpler Vergleich, bei dem bei Bedarf eine Typkonvertierung stattfindet. Datumsangaben werden üblicherweise als Stringliteral geschrieben und da gibt es auch kein Problem, so ein Stringliteral mit einem Datum zu vergleichen, wenn das Stringliteral syntaktisch richtig wie ein Datum geschrieben ist.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749401#m1749401dedlfix2019-05-26T17:05:53Z2019-05-26T17:05:53ZKeine Ausgabe - komplizierte Abfrage<p>Tach!</p>
<blockquote>
<p>Scheinbar muss ich eine ganz bestimmte Reihenfolge einhalten wenn ich mit einem Datum arbeite?</p>
</blockquote>
<p>Das hat nichts mit bestimmten Datentypen zu tun, sondern mit Mengenlehre. Wenn du zwei Mengen miteinander verbindest und dabei entsteht kein Ergebnis, kann auch keins mehr entstehen, wenn du noch eine Menge hinzufügst, die keinen Anknüpfungspunkt in der leeren Menge finden kann.</p>
<p>Deswegen empfahl ich ja das schrittweise Vorgehen, damit du siehst, was da jeweils entsteht.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749424#m1749424Bernd2019-05-27T07:27:39Z2019-05-27T07:27:39ZKeine Ausgabe - komplizierte Abfrage<p>Hallo,</p>
<blockquote>
<pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">FROM</span> kalender_termine
<span class="token keyword">JOIN</span> kalender_arten usw<span class="token punctuation">.</span>
<span class="token keyword">WHERE</span> kt_datum <span class="token operator">=</span> <span class="token string">'..'</span>
</code></pre>
</blockquote>
<p>das habe ich gestern bereits gemacht:<br>
<a href="https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749400#m1749400" rel="noopener noreferrer">https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749400#m1749400</a></p>
<p>Ich dachte bis zu diesem Zeitpunkt immer, die Reihenfolge spielt keine Rolle.</p>
<blockquote>
<p>Und arbeite mit aussagekräftigen Alias'n bei Deinen Abfragen!</p>
</blockquote>
<p>Du meinst mit AS? Ich finde persönlich es sehr umständlich jede Spalte umzubenennen.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749427#m1749427pl2019-05-27T07:37:07Z2019-05-27T07:37:07ZKeine Ausgabe - komplizierte Abfrage<p>Hallo,</p>
<blockquote>
<blockquote>
<pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">FROM</span> kalender_termine
<span class="token keyword">JOIN</span> kalender_arten usw<span class="token punctuation">.</span>
<span class="token keyword">WHERE</span> kt_datum <span class="token operator">=</span> <span class="token string">'..'</span>
</code></pre>
</blockquote>
<p>das habe ich gestern bereits gemacht:<br>
<a href="https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749400#m1749400" rel="noopener noreferrer">https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749400#m1749400</a></p>
<p>Ich dachte bis zu diesem Zeitpunkt immer, die Reihenfolge spielt keine Rolle.</p>
</blockquote>
<p>Die Reihenfolge bestimmt ja ob es ein LEFT oder RIGHT Join wird.</p>
<blockquote>
<blockquote>
<p>Und arbeite mit aussagekräftigen Alias'n bei Deinen Abfragen!</p>
</blockquote>
<p>Du meinst mit AS? Ich finde persönlich es sehr umständlich jede Spalte umzubenennen.</p>
</blockquote>
<p>Ja, AS bzw. Alias. Es geht ja nicht um das Umbebennen schlechthin sondern um die Weiterverarbeitung! So kann man z.B. die Aliase auf die Schlüssel einer Templating Engine anpassen und dies auch umgekehrt. Wenn das Template bereits steht und der Kollege sagt da muss <code>Vorname</code> rein dann wird einfach nur ein Alias entsprechend gesetzt und nicht das ganze Template geändert. MFG</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749517#m1749517pl2019-05-28T07:26:44Z2019-05-28T07:26:44ZSinn und Zweckmäßigkeit von Alias<p>PS: Der Alias ist ein wichtiges Instrument zur Trennung von Datenhaltung und Anwendung. Durch eine solche Abstrahierung wird der Datenhaltungslayer transparenter und alles zusammen wartungsfreundlicher. D.h. daß Du per Alias besser mit etwaigen Veränderungen/Skalierungen zurechtkommst, weil <code>tabname.colname</code> eben nicht namentlich in die Anwendung verschleppt wird und wenn da eine Änderung eforderlich wird, bleibt der Alias davon unberührt.</p>
<p>Darüber hinaus liefern Funktionen z.B. so etwas</p>
<pre><code class="block">mysql> select count(url) from log;
+------------+
| count(url) |
+------------+
| 1997 |
+------------+
mysql> select count(url) as cnt from log;
+------+
| cnt |
+------+
| 1997 |
+------+
</code></pre>
<p>was die Zweckmäßigkeit eines ALias selbst erklärt. Insgesamt ist die Vergabe von Alias'n eine praktische Angelegenheit die sich in vielen Jahren meiner Programmiertätigkeit immer wieder als sehr nützlich erwiesen hat. MFG</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749435#m1749435dedlfix2019-05-27T08:27:11Z2019-05-27T08:27:11ZKeine Ausgabe - komplizierte Abfrage<p>Tach!</p>
<blockquote>
<blockquote>
<blockquote>
<pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">FROM</span> kalender_termine
<span class="token keyword">JOIN</span> kalender_arten usw<span class="token punctuation">.</span>
<span class="token keyword">WHERE</span> kt_datum <span class="token operator">=</span> <span class="token string">'..'</span>
</code></pre>
</blockquote>
<p>das habe ich gestern bereits gemacht:<br>
<a href="https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749400#m1749400" rel="noopener noreferrer">https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749400#m1749400</a></p>
<p>Ich dachte bis zu diesem Zeitpunkt immer, die Reihenfolge spielt keine Rolle.</p>
</blockquote>
<p>Die Reihenfolge bestimmt ja ob es ein LEFT oder RIGHT Join wird.</p>
</blockquote>
<p>Das ist nach wie vor nicht richtig. Ein Outer Join, ob Left oder Right, benötigt LEFT oder RIGHT als Schlüsselwort, sonst ist es ein Inner Join. Lediglich das Schlüsselwort OUTER kann weggelassen werden.</p>
<p>Dass es dann immer noch darauf ankommt, was links vom LEFT/RIGHT OUTER JOIN und was rechts steht, ist unbestritten. Das sollte ja auch anhand des Verhaltens klar sein, dass eine davon die Haupttabelle sein muss, deren Datensätze immer in die Ergebnismenge kommen, und die Felder der anderen bei Abwesenheit eines Datensatzes mit Verknüpfungsbedingung zu NULL werden können. Nur das Schlüsselwort LEFT/RIGHT kann nicht wegelassen werden.</p>
<blockquote>
<blockquote>
<blockquote>
<p>Und arbeite mit aussagekräftigen Alias'n bei Deinen Abfragen!</p>
</blockquote>
<p>Du meinst mit AS? Ich finde persönlich es sehr umständlich jede Spalte umzubenennen.</p>
</blockquote>
</blockquote>
<p>Das ist auch nicht notwendig. Wenn du mit deiner Benennung zufrieden bist und du keinen Grund für eine Alias siehst oder es keinen technischen Zwang gibt (gibt es in dem Fall nicht), kannst du das problemlos so lassen.</p>
<blockquote>
<p>Ja, AS bzw. Alias. Es geht ja nicht um das Umbebennen schlechthin sondern um die Weiterverarbeitung! So kann man z.B. die Aliase auf die Schlüssel einer Templating Engine anpassen und dies auch umgekehrt.</p>
</blockquote>
<p>Das kann man auch mit den derzeitigen Bezeichnern.</p>
<blockquote>
<p>Wenn das Template bereits steht und der Kollege sagt da muss <code>Vorname</code> rein dann wird einfach nur ein Alias entsprechend gesetzt und nicht das ganze Template geändert.</p>
</blockquote>
<p>Ja, wenn dann. Es gibt immer Gründe für irgendeine bestimmte Maßnahmen. Nur es als unabdingbar hinzustellen, ist nicht notwendig.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749520#m1749520dedlfix2019-05-28T08:05:38Z2019-05-28T08:05:38ZSinn und Zweckmäßigkeit von Alias<p>Tach!</p>
<blockquote>
<p>PS: Der Alias ist ein wichtiges Instrument zur Trennung von Datenhaltung und Anwendung. Durch eine solche Abstrahierung wird der Datenhaltungslayer transparenter und alles zusammen wartungsfreundlicher. D.h. daß Du per Alias besser mit etwaigen Veränderungen/Skalierungen zurechtkommst, weil <code>tabname.colname</code> eben nicht namentlich in die Anwendung verschleppt wird und wenn da eine Änderung eforderlich wird, bleibt der Alias davon unberührt.</p>
</blockquote>
<p>Naja. Üblicherweise steht das SQL-Statement im Code direkt vor der Abfrageroutine. Ob man einen Namenswechsel - falls man ihn benötigt - nun per Alias oder im nachfolgenden Code vornimmt, nimmt sich vom Aufwand her nicht viel. Langname und gegebenenfalls Alias stehen also bereits in der Anwendung, weil das Statement darin notiert ist. Welchen Namen man im weiteren Verlauf nehmen möchte, ist eine Frage der Vorliebe. Wenn sich der Feldname in Zukunft ändert, kann man immer noch einen Alias hinzufügen oder ein Umschreiben nach der Abfrage vornehmen. Beides liegt nahe beieinander. Ich sehe die Sache mit dem Alias weniger dramatisch, als du sie hier darstellst. Man kann, aber man muss nicht.</p>
<p>Pseudocode:</p>
<pre><code class="block">sql = "SELECT p_name AS name FROM person"
query(sql)
records = []
while ...
records[] = fetch_array
end
return records
</code></pre>
<pre><code class="block">sql = "SELECT p_name FROM person"
query(sql)
while ...
record = fetch_array
records[] = ["name" => record["p_name"]]
end
return records
</code></pre>
<p>Ja, man spart sich das anschließende Umschreiben, vor allem wenn man es nur wegen der Namensänderung und nicht noch aus anderen Gründen macht. Auf der anderen Seite steht nur ein etwas längeres SQL-Statement. Aber wenn man mit seinem p_name völlig zufrieden ist, braucht man weder Alias noch eine Nachbehandlung, und hat trotzdem eine offene Zukunft mit einer der beiden Varianten.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749521#m1749521pl2019-05-28T08:16:11Z2019-05-28T08:16:11ZSinn und Zweckmäßigkeit von Alias<p>Ich frag mich immer wieder warum PHP es immer noch nicht geschafft hat, korrespondierende Klammern als Stringbegrenzer einzuführen die 1. ermöglichen SQL Statements mehrzeilig und übersichtlich zu schreiben und die 2. jeder gängige Editor als zusammengehörig erkennt.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749522#m1749522Rolf B2019-05-28T08:20:21Z2019-05-28T08:22:20ZSinn und Zweckmäßigkeit von Alias<p>Hallo pl,</p>
<p>Nr. 1 löst PHP mit der HEREDOC/NOWDOC Syntax. Sicher, es gibt schöneres. Aber das Feature "mehrzeilige Strings" ist grundsätzlich da.</p>
<p>Nr. 2 ist ein leichtes Problem, man muss dann schon einen EDITOR verwenden, der PHP-Syntax kennt. Das kann nicht jeder, aber viele.</p>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - clusi
</div>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749523#m1749523dedlfix2019-05-28T08:27:33Z2019-05-28T08:27:33ZSinn und Zweckmäßigkeit von Alias<p>Tach!</p>
<blockquote>
<p>Ich frag mich immer wieder warum PHP es immer noch nicht geschafft hat, korrespondierende Klammern als Stringbegrenzer einzuführen die 1. ermöglichen SQL Statements mehrzeilig und übersichtlich zu schreiben und die 2. jeder gängige Editor als zusammengehörig erkennt.</p>
</blockquote>
<p>In welchen wichtigen Sprachen werden denn Klammern als Stringbegrenzer verwendet? PHP hat für diesen Zweck die Heredoc- und Nowdoc-Syntax, die auch <a href="https://en.wikipedia.org/wiki/Here_document" rel="nofollow noopener noreferrer">anderenorts bekannt</a> ist.</p>
<pre><code class="block language-php"><span class="token variable">$text</span> <span class="token operator">=</span> <span class="token string heredoc-string"><span class="token delimiter symbol"><span class="token punctuation"><<<</span>END</span>
Zeile 1
Zeile 2
<span class="token delimiter symbol">END<span class="token punctuation">;</span></span></span>
<span class="token function">was_anderes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
</code></pre>
<p>Kann Notepad++ genau wie Syntaxhervorhebung des Forums problemlos erkennen. Damit sollte auch jeder andere Editor zurechtkommen, der Bash-Unterstützung an Bord hat.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749528#m1749528pl2019-05-28T11:13:34Z2019-05-28T11:15:23ZSinn und Zweckmäßigkeit von Alias<blockquote>
<p>In welchen wichtigen Sprachen werden denn Klammern als Stringbegrenzer verwendet?</p>
</blockquote>
<p>in Perl:</p>
<pre><code class="block language-perl"><span class="token keyword">my</span> $<span class="token string">q = q(
SELECT
a.name as Lastname,
a.vname as Firstname,
k.name as Konfession
FROM
address a
JOIN
konfession k USING(id)
WHERE
k.name =</span> <span class="token string">"Konfessionslos"</span>
ORDER by
a<span class="token operator">.</span>name
<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<p>Und je nach Geschmack kann man auch [] oder {} als korrespondierende Klammern verwenden, die jeder Editor zuordnen kann, gerade bei längeren Geschichten.</p>
<p>MFG</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749529#m1749529dedlfix2019-05-28T11:37:17Z2019-05-28T11:37:17ZSinn und Zweckmäßigkeit von Alias<p>Tach!</p>
<blockquote>
<blockquote>
<p>In welchen wichtigen Sprachen werden denn Klammern als Stringbegrenzer verwendet?</p>
</blockquote>
<p>in Perl:</p>
</blockquote>
<p>Ich frage nach wichtigen Sprachen. </p>
<blockquote>
<p>Und je nach Geschmack kann man auch [] oder {} als korrespondierende Klammern verwenden, die jeder Editor zuordnen kann, gerade bei längeren Geschichten.</p>
</blockquote>
<p>Ach, und was ist, wenn nicht nur der Editor sondern auch Perl selbst bei kürzeren Geschichten schon aus dem Tritt kommen?</p>
<pre><code class="block bad language-perl"><span class="token keyword">my</span> <span class="token variable">$q</span> <span class="token operator">=</span> <span class="token string">q(foo )</span> bar<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<p>Jedenfalls hat PHP (und andere Sprachen) sowohl mit Anführungszeichen als auch mit Herdoc/Nowdoc die Möglichkeit, Strings übersichtlich und mehrzeilig zu erstellen.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749531#m1749531Matthias Apselmatthias.apsel@selfhtml.orghttps://brückentage.info2019-05-28T11:52:38Z2019-05-28T11:52:38ZSinn und Zweckmäßigkeit von Alias<p>Hallo pl,</p>
<blockquote>
<p>in Perl:</p>
<pre><code class="block language-perl"><span class="token keyword">my</span> $<span class="token string">q = q(
SELECT
a.name as Lastname,
a.vname as Firstname,
k.name as Konfession
FROM
address a
JOIN
konfession k USING(id)
WHERE
k.name =</span> <span class="token string">"Konfessionslos"</span>
ORDER by
a<span class="token operator">.</span>name
<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
</blockquote>
<p>in PHP:</p>
<pre><code class="block language-php"><span class="token variable">$q</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"
SELECT
a.name as Lastname,
a.vname as Firstname,
k.name as Konfession
FROM
address a
LEFT JOIN
konfession k USING(id)
WHERE
k.name = 'Konfessionslos'
ORDER by
a.name
"</span><span class="token punctuation">;</span>
</code></pre>
<p>Bis demnächst<br>
Matthias</p>
<div class="signature">-- <br>
Pantoffeltierchen haben keine Hobbys.<br>
¯\_(ツ)_/¯
</div>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749532#m1749532Rolf B2019-05-28T11:58:17Z2019-05-28T11:59:11ZSinn und Zweckmäßigkeit von Alias<p>Hallo pl,</p>
<pre><code class="block language-php"><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">q</span> <span class="token operator">=</span> <span class="token string heredoc-string"><span class="token delimiter symbol"><span class="token punctuation"><<<</span>SQL</span>
SELECT
a.name as Lastname,
a.vname as Firstname,
k.name as Konfession
FROM
address a
JOIN
konfession k USING(id)
WHERE
k.name = "Konfessionslos"
ORDER by
a.name
<span class="token delimiter symbol">SQL<span class="token punctuation">;</span></span></span>
</code></pre>
<p>geht doch. Ab PHP 7.3 muss das End-SQL auch nicht mehr zwingend auf Stelle 1 stehen. Rücke ich es 4 Stellen ein, werden im heredoc-String pro Zeile die ersten 4 Stellen entfernt.</p>
<pre><code class="block language-php"><span class="token variable">$q</span> <span class="token operator">=</span> <span class="token operator"><<</span><span class="token operator"><</span><span class="token constant">SQL</span>
<span class="token constant">SELECT</span> <span class="token operator">*</span>
<span class="token constant">FROM</span> foo
<span class="token constant">ORDER</span> <span class="token constant">BY</span> bar
<span class="token constant">SQL</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$q</span><span class="token punctuation">;</span>
</code></pre>
<p>ergibt</p>
<pre><code class="block"> SELECT *
FROM foo
ORDER BY bar
</code></pre>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - clusi
</div>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749545#m1749545pl2019-05-28T18:22:53Z2019-05-28T18:22:53ZSinn und Zweckmäßigkeit von Alias<blockquote>
<blockquote>
<p>In welchen wichtigen Sprachen werden denn Klammern als Stringbegrenzer verwendet?</p>
</blockquote>
<p>in Perl:</p>
<pre><code class="block language-perl"><span class="token keyword">my</span> $<span class="token string">q = q(
SELECT
a.name as Lastname,
a.vname as Firstname,
k.name as Konfession
FROM
address a
JOIN
konfession k USING(id)
WHERE
k.name =</span> <span class="token string">"Konfessionslos"</span>
ORDER by
a<span class="token operator">.</span>name
<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<p>Und je nach Geschmack kann man auch [] oder {} als korrespondierende Klammern verwenden, die jeder Editor zuordnen kann, gerade bei längeren Geschichten.</p>
<p>MFG</p>
</blockquote>
<p>PS: Das Template mit Mustache sähe dann so aus:</p>
<pre><code class="block language-mustache"><span class="token delimiter punctuation">{{</span><span class="token block keyword">#names}}</span>
<span class="token punctuation"><</span><span class="token variable">tr</span><span class="token punctuation">></span>
<span class="token punctuation"><</span><span class="token variable">td</span><span class="token punctuation">></span> <span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token variable">Lastname</span><span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation"><</span><span class="token punctuation">/</span><span class="token variable">td</span><span class="token punctuation">></span>
<span class="token punctuation"><</span><span class="token variable">td</span><span class="token punctuation">></span> <span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token variable">Firstname</span><span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation"><</span><span class="token punctuation">/</span><span class="token variable">td</span><span class="token punctuation">></span>
<span class="token punctuation"><</span><span class="token variable">td</span><span class="token punctuation">></span> <span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token variable">Konfession</span><span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation"><</span><span class="token punctuation">/</span><span class="token variable">td</span><span class="token punctuation">></span>
<span class="token punctuation"><</span><span class="token punctuation">/</span><span class="token variable">tr</span><span class="token punctuation">></span>
<span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token punctuation">/</span><span class="token variable">names</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
</code></pre>
<p>(Table Body) Und die dazugehörige Datenstruktur mit der das gerendert wird, liefert eine einzige Anweisung</p>
<pre><code class="block language-perl"><span class="token keyword">my</span> <span class="token variable">$names</span> <span class="token operator">=</span> <span class="token variable">$dbh</span><span class="token operator">-></span>selectall_arrayref<span class="token punctuation">(</span>$<span class="token string">q, {Slice=>{}});
Template::Mustache->render( $tbody,</span> <span class="token punctuation">{</span> names <span class="token operator">=></span> <span class="token variable">$names</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<p>Von soviel Komfort können PHP Entwickler gar nicht träumen weil sie sowas noch nie gesehen, geschweige denn angewandt haben </p>
<p>MFG</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749530#m1749530pl2019-05-28T11:47:52Z2019-05-28T11:47:52ZSinn und Zweckmäßigkeit von Alias<p>hi,</p>
<blockquote>
<p>Ach, und was ist, wenn nicht nur der Editor sondern auch Perl selbst bei kürzeren Geschichten schon aus dem Tritt kommen?</p>
<pre><code class="block bad language-perl"><span class="token keyword">my</span> <span class="token variable">$q</span> <span class="token operator">=</span> <span class="token string">q(foo )</span> bar<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
</blockquote>
<p>Wenn hier jemand aus dem Tritt kommt ist das nicht Perl sondern der Programmierer der den Kontext nicht beachtet. <code>my $q = q[foo ) bar];</code> wäre eine Variante dem gerecht zu werden. Der <a href="https://rolfrost.de/perldoc.html?f=q" rel="nofollow noopener noreferrer">q-Operator</a> erlaubt es schließlich, die Stringbegrenzerzeichen selbst festzulegen, so daß man auf zusätzliche Maskierungen verzichten kann.</p>
<p>MFG</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749533#m1749533Rolf B2019-05-28T11:59:16Z2019-05-28T12:03:21ZSinn und Zweckmäßigkeit von Alias<p>Hallo Matthias,</p>
<p>äh, nö? Zumindest bei mir nicht.</p>
<p>Update.</p>
<p>äh doch. Habe die " nicht in ' konvertiert <br>
Aber das zeigt den Vorteil von heredoc/nowdoc: Man kann mit Anführungszeichen um sich schmeißen wie man will.</p>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - clusi
</div>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749544#m1749544pl2019-05-28T18:04:31Z2019-05-28T18:04:31ZSinn und Zweckmäßigkeit von Alias<p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p>
<p>Das kannste mit Perl auch alles so machen. Macht aber keiner. Das macht höchstens jemand, der den Sinn des q-Operators nicht verstanden hat. Wenn wir schon programmieren dann mit Stil, <a href="https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749528#m1749528" rel="noopener noreferrer">so muss das aussehen.</a></p>
<p>Und dann wäre noch ein nettes Feature was Perl bietet:</p>
<pre><code class="block language-perl"><span class="token comment"># hier steht Code</span>
<span class="token comment"># Zugriff auf die Texte unterhalb des DATA-Token</span>
read<span class="token punctuation">(</span>DATA<span class="token punctuation">,</span> <span class="token keyword">my</span> <span class="token variable">$text</span><span class="token punctuation">,</span> <span class="token operator">-s</span> DATA<span class="token punctuation">)</span><span class="token punctuation">;</span>
__DATA__
Hier stehen SQL Statments<span class="token punctuation">,</span> Texte<span class="token punctuation">,</span> Templates usw<span class="token operator">.</span>
</code></pre>
<p>Womit man Texte/Templates auch hervorragend vom Code trennen kann. MFG</p>
https://forum.selfhtml.org/self/2019/may/26/keine-ausgabe-komplizierte-abfrage/1749554#m17495541unitedpower2019-05-29T06:48:02Z2019-05-29T06:48:02ZSinn und Zweckmäßigkeit von Alias<blockquote>
<pre><code class="block language-perl"><span class="token keyword">my</span> <span class="token variable">$names</span> <span class="token operator">=</span> <span class="token variable">$dbh</span><span class="token operator">-></span>selectall_arrayref<span class="token punctuation">(</span>$<span class="token string">q, {Slice=>{}});
Template::Mustache->render( $tbody,</span> <span class="token punctuation">{</span> names <span class="token operator">=></span> <span class="token variable">$names</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<p>Von soviel Komfort können PHP Entwickler gar nicht träumen weil sie sowas noch nie gesehen, geschweige denn angewandt haben </p>
</blockquote>
<p>In PHP sähe das etwas kürzer aus:</p>
<pre><code class="block language-php"><span class="token variable">$names</span> <span class="token operator">=</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">fetchAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Mustache_Engine</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token variable">$tbody</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'names'</span> <span class="token operator">=></span> <span class="token variable">$names</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>