tag:forum.selfhtml.org,2005:/self mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben – SELFHTML-Forum 2020-05-05T19:41:01Z https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770021#m1770021 LastBoyScout 2020-05-04T15:36:47Z 2020-05-04T15:36:47Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Ich Suche in einer mySQL- Tabelle über mehre Spalten hinweg:</p> <p><code>SELECT * FROM tabelle WHERE PHONE LIKE '$search' OR MOBILE LIKE '$search' OR FAX LIKE '$search'</code></p> <p>Nun würde ich bei einem Treffer gerne auch die Bezeichnung jener Spalte erhalten, welche letztendlich den Treffer liefert. Gibt es hierzu eine elegante Möglichkeit? Oder muss ich hierzu das Ergebnis mit anderen Mitteln erneut auswerten?</p> <p>Habe schon recherchiert, aber hierzu leider keinen Anhaltspunkt gefunden.</p> <p><em>Danke und Gruß,</em></p> <p><em>LBS</em></p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770023#m1770023 MudGuard http://www.andreas-waechter.de/ 2020-05-04T15:44:19Z 2020-05-04T15:44:19Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hi,</p> <blockquote> <p>Ich Suche in einer mySQL- Tabelle über mehre Spalten hinweg:</p> <p><code>SELECT * FROM tabelle WHERE PHONE LIKE '$search' OR MOBILE LIKE '$search' OR FAX LIKE '$search'</code></p> <p>Nun würde ich bei einem Treffer gerne auch die Bezeichnung jener Spalte erhalten, welche letztendlich den Treffer liefert.</p> </blockquote> <p>Wieso 'jener Spalte'? 'jene Spalte<strong>n</strong>' wäre doch richtiger.</p> <p>Ich kenne Leute, die haben gar keine Festnetznummer, die geben bei solchen Formularen bei PHONE und bei MOBILE ihre einzige Nummer an …</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770025#m1770025 TS ts-self@online.de https://bitworks.de 2020-05-04T15:50:53Z 2020-05-04T15:51:28Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hello,</p> <blockquote> <p>Ich Suche in einer mySQL- Tabelle über mehre Spalten hinweg:</p> <p><code>SELECT * FROM tabelle WHERE PHONE LIKE '$search' OR MOBILE LIKE '$search' OR FAX LIKE '$search'</code></p> <p>Nun würde ich bei einem Treffer gerne auch die Bezeichnung jener Spalte erhalten, welche letztendlich den Treffer liefert. Gibt es hierzu eine elegante Möglichkeit? Oder muss ich hierzu das Ergebnis mit anderen Mitteln erneut auswerten?</p> <p>Habe schon recherchiert, aber hierzu leider keinen Anhaltspunkt gefunden.</p> </blockquote> <p>Du könntest das Statement mit der <a href="https://dev.mysql.com/doc/refman/8.0/en/control-flow-functions.html#function_if" rel="nofollow noopener noreferrer"><code>if()-Funktion</code></a> weiter verkomplizieren.</p> <p>Oder Du könntest weiter normalisieren.</p> <pre><code class="block language-text">clientno type data -------------------------------- 70678 Fax 0531/12345-7 70678 Tel 0531/12345-0 70678 Mail hans@dampf.lan 70678 Mob 0171/555333555 </code></pre> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770027#m1770027 Rolf B 2020-05-04T15:52:15Z 2020-05-04T15:52:15Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hallo LastBoyScout,</p> <p>ich hätte zwei Alternativen.</p> <p>(1) Verwende UNION ALL statt OR:</p> <pre><code class="block language-sql"> <span class="token keyword">SELECT</span> tabelle<span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">,</span> <span class="token string">'PHONE'</span> <span class="token keyword">as</span> fundstelle <span class="token keyword">FROM</span> tabelle <span class="token keyword">WHERE</span> PHONE <span class="token operator">LIKE</span> <span class="token string">'$search'</span> <span class="token keyword">UNION</span> <span class="token keyword">ALL</span> <span class="token keyword">SELECT</span> tabelle<span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">,</span> <span class="token string">'MOBILE'</span> <span class="token keyword">as</span> fundstelle <span class="token keyword">FROM</span> tabelle <span class="token keyword">WHERE</span> MOBILE <span class="token operator">LIKE</span> <span class="token string">'$search'</span> <span class="token keyword">UNION</span> <span class="token keyword">ALL</span> <span class="token keyword">SELECT</span> tabelle<span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">,</span> <span class="token string">'FAX'</span> <span class="token keyword">as</span> fundstelle <span class="token keyword">FROM</span> tabelle <span class="token keyword">WHERE</span> FAX <span class="token operator">LIKE</span> <span class="token string">'$search'</span> </code></pre> <p>(2) Ermittle die Fundstelle über einen CASE-Ausdruck.</p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> tabelle<span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">,</span> <span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> PHONE <span class="token operator">LIKE</span> <span class="token string">'$search'</span> <span class="token keyword">THEN</span> <span class="token string">'PHONE'</span> <span class="token keyword">WHEN</span> MOBILE <span class="token operator">LIKE</span> <span class="token string">'$search'</span> <span class="token keyword">THEN</span> <span class="token string">'MOBILE'</span> <span class="token keyword">WHEN</span> FAX <span class="token operator">LIKE</span> <span class="token string">'$search'</span> <span class="token keyword">THEN</span> <span class="token string">'FAX'</span> <span class="token keyword">END</span> <span class="token keyword">as</span> fundStelle <span class="token keyword">FROM</span> tabelle <span class="token keyword">WHERE</span> PHONE <span class="token operator">LIKE</span> <span class="token string">'$search'</span> <span class="token operator">OR</span> MOBILE <span class="token operator">LIKE</span> <span class="token string">'$search'</span> <span class="token operator">OR</span> FAX <span class="token operator">LIKE</span> <span class="token string">'$search'</span> </code></pre> <p>Schön ist beides nicht. In der ersten Variante rennst Du 3x durch die Tabelle, in der zweiten Variante prüfst Du alles doppelt. Vermutlich ist die 2. Variante schneller.</p> <p>Ich überlege gerade noch ob man eine Cursorschleife sinnvoll einsetzen kann, aber das dürfte unter dem Strich am mühsamsten und langsamsten sein.</p> <p>Dass Du beim befüllen der Variablen $search an's Escapen denken musst, schreibe ich mal rein pro forma unten drunter </p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770024#m1770024 MudGuard http://www.andreas-waechter.de/ 2020-05-04T15:49:13Z 2020-05-04T15:49:13Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hi,</p> <p>Nachtrag:</p> <p>wenn nur eine der Spalten ausgegeben werden soll, die zutrifft,könnte man evtl. was mit verschachteltem if machen.</p> <p>A la <code>SELECT t.*, if (PHONE LIKE '$search','PHONE', if (MOBILE LIKE '$search), 'MOBILE', 'FAX') from tabelle t …</code></p> <p>Brauchst Du wirklich like? Suchst Du mit Wildcards ('%' bzw. '_')? Ansonsten besser das <code>like</code> durch ein <code>=</code> ersetzen.</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770026#m1770026 LastBoyScout 2020-05-04T15:51:07Z 2020-05-04T15:51:07Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hi Andreas,</p> <blockquote> <p>Wieso 'jener Spalte'? 'jene Spalte<strong>n</strong>' wäre doch richtiger.</p> <p>Ich kenne Leute, die haben gar keine Festnetznummer, die geben bei solchen Formularen bei PHONE und bei MOBILE ihre einzige Nummer an …</p> </blockquote> <p>Ne, Singular ist schon korrekt...</p> <p>Handelt sich hierbei um eine einigermaßen gepflegte lokale Datenbank </p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770028#m1770028 LastBoyScout 2020-05-04T15:58:19Z 2020-05-04T15:58:19Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <blockquote> <p>Brauchst Du wirklich like? Suchst Du mit Wildcards ('%' bzw. '_')? Ansonsten besser das <code>like</code> durch ein <code>=</code> ersetzen.</p> </blockquote> <p>Ja, Suche mit % am Ende, damit auch Einträge Auflistet werden welche eine abweichenden Durchwahl haben.</p> <p>Hatte gehofft mySQL hat für so etwas eine elegante Funktion an Board.</p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770029#m1770029 LastBoyScout 2020-05-04T16:02:59Z 2020-05-04T16:02:59Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <blockquote> <p>Oder Du könntest weiter normalisieren.</p> <pre><code class="block language-text">clientno type data -------------------------------- 70678 Fax 0531/12345-7 70678 Tel 0531/12345-0 70678 Mail hans@dampf.lan 70678 Mob 0171/555333555 </code></pre> </blockquote> <p>Könntest Du das Bitte perzisieren, stehe da momentan auf dem Schlauch!?</p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770031#m1770031 LastBoyScout 2020-05-04T16:11:03Z 2020-05-04T16:11:03Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hallo Rolf,</p> <p>Danke für deine Anregungen... tendiere wohl zu Lösung 2</p> <p>Etwas detaillierter sieht es bei mir aktuell so aus, wobei ich beim Suchstring nur Zahlen durchlasse:</p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> tabelle <span class="token keyword">WHERE</span> <span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span>PHONE<span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token operator">LIKE</span> <span class="token string">'$search%'</span> <span class="token operator">OR</span> <span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span>MOBILE<span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token operator">LIKE</span> <span class="token string">'$search%'</span> <span class="token operator">OR</span> <span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span>FAX<span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token operator">LIKE</span> <span class="token string">'$search%'</span> </code></pre> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770030#m1770030 Rolf B 2020-05-04T16:04:33Z 2020-05-04T16:04:33Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hallo LastBoyScout,</p> <p>ja, hat es. LIKE.</p> <p>Wenn die Spalten indexiert sind, ist ein LIKE mit % am Ende effizient. Die Wahrheit liefert aber immer nur der Explain.</p> <p>Ich meine jedoch, dass die Zeiten längst vorbei sind, wo man „aus Performancegründen“ die Abfrage <code>PHONE LIKE '$search'</code> durch <code>PHONE >= '$search' AND PHONE < '{$search}999999999'</code> ersetzt hat.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770037#m1770037 TS ts-self@online.de https://bitworks.de 2020-05-04T17:41:50Z 2020-05-04T17:41:50Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hello,</p> <blockquote> <blockquote> <p>Oder Du könntest weiter normalisieren.</p> <pre><code class="block language-text">clientno type data -------------------------------- 70678 Fax 0531/12345-7 70678 Tel 0531/12345-0 70678 Mail hans@dampf.lan 70678 Mob 0171/555333555 </code></pre> </blockquote> <p>Könntest Du das Bitte perzisieren, stehe da momentan auf dem Schlauch!?</p> </blockquote> <p>Statt dass Du dir einen Krampf in der SQL-Schicht codest mit dem vorhandenen (schlechten) Datenmodell und dann voraussichtlich auch in der API noch so verknotet weitermachen musst, könntest Du dein Datenmodell überdenken, und die Eigenschaften (Tel, Fax, Mobile, Mail, ...) aus der Waagerechten (dem Datensatz) herausnehmen und in die Senkrechte (eine eigene Tabelle) verfrachten.</p> <p>Und plötzlich wären die Zuordnungsprobleme verschwunden.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770032#m1770032 LastBoyScout 2020-05-04T16:16:23Z 2020-05-04T16:16:23Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <blockquote> <p>ja, hat es. LIKE.</p> </blockquote> <p>Meine eigentlich eine Funktion welche bei einer Suche auch die Bezeichnung Treffer liefernder Spalte/n zurück gibt.</p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770033#m1770033 Der Martin 2020-05-04T16:16:31Z 2020-05-04T16:16:31Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hallo,</p> <blockquote> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> tabelle <span class="token keyword">WHERE</span> <span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span>PHONE<span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token operator">LIKE</span> <span class="token string">'$search%'</span> <span class="token operator">OR</span> <span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span>MOBILE<span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token operator">LIKE</span> <span class="token string">'$search%'</span> <span class="token operator">OR</span> <span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span>FAX<span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token operator">LIKE</span> <span class="token string">'$search%'</span> </code></pre> </blockquote> <p>ohne es zu wissen, stelle ich einfach mal zur Diskussion: Ist die String-Manipulation (Blank, Slash und Hyphen entfernen) in der Host-Applikation eventuell effizienter als ein dreifach verschachtelter SQL-Funktionsaufruf?</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770034#m1770034 dedlfix 2020-05-04T16:17:48Z 2020-05-04T16:17:48Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Tach!</p> <blockquote> <p>Etwas detaillierter sieht es bei mir aktuell so aus, wobei ich beim Suchstring nur Zahlen durchlasse:</p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> tabelle <span class="token keyword">WHERE</span> <span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span>PHONE<span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token operator">LIKE</span> <span class="token string">'$search%'</span> <span class="token operator">OR</span> <span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span>MOBILE<span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token operator">LIKE</span> <span class="token string">'$search%'</span> <span class="token operator">OR</span> <span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span><span class="token keyword">REPLACE</span><span class="token punctuation">(</span>FAX<span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token operator">LIKE</span> <span class="token string">'$search%'</span> </code></pre> </blockquote> <p>Solche Suchanfragen sollte man nicht auf ein DBMS loslassen. Felder, die erst noch berechnet werden müssen, bekommt man nur mit einem Full Table Scan gefunden. Speicher lieber ein extra Feld mit der selben Nummer ohne Sonderzeichen, dann kann das DBMS auch einen Index verwenden.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770035#m1770035 Rolf B 2020-05-04T16:19:01Z 2020-05-04T16:19:01Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hallo LastBoyScout,</p> <p>aua, das sieht nicht hübsch aus. Dieses Klammerdickicht muss dann ja auch noch in den CASE hinein.</p> <p>Der UNION ALL ist dann wohl lesbarer.</p> <p>Ich habe gerade auch noch über eine UNPIVOTisierung nachgedacht, d.h. du erzeugst Dir eine temporäre Tabelle in dem Stil wie Tom sie vorgeschlagen hat. Das geht ebenfalls über UNION ALL. Problem ist nur, dass das bei einer großen Tabelle viel Zeit kostet.</p> <p>Wie groß ist deine Tabelle? Wie oft suchst Du darin? Kann es sinnvoll sein, berechnete Spalten hinzuzufügen, in der die Telefonnummern ohne Sonderzeichen stehen? Kann es sinnvoll sein, eine Zusatztabelle einzuführen, wo die gefilterten Werte drin stehen und wo jede Nummer zusammen mit Verwendungszweck in einer einzelnen Zeile steht? So eine Suchtabelle muss man pflegen, ja, aber falls die Suche andernfalls grottenlahm wird...</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770036#m1770036 LastBoyScout 2020-05-04T16:26:57Z 2020-05-04T16:28:55Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Mir ist bewusst das diese Verschachtelung äußerst unschön ist... leider kann ich hier auf die Tabelle nur lesend zugreifen, da es sich um Daten einer anderen Anwendung handelt. Und da nicht immer klar ist, wie die Rufnummer eingetragen wurde, muss ich das ja irgendwie berücksichtigen!?</p> <p>P.S. Hintergrund ist, bei einem eingehenden Anruf den passenden Datensatz zu ermitteln.</p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770038#m1770038 Der Martin 2020-05-04T17:49:32Z 2020-05-04T17:49:32Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>n'Abend,</p> <blockquote> <blockquote> <blockquote> <pre><code class="block language-text">clientno type data -------------------------------- 70678 Fax 0531/12345-7 70678 Tel 0531/12345-0 70678 Mail hans@dampf.lan 70678 Mob 0171/555333555 </code></pre> </blockquote> <p>Könntest Du das Bitte perzisieren, stehe da momentan auf dem Schlauch!?</p> </blockquote> <p>Statt dass Du dir einen Krampf in der SQL-Schicht codest mit dem vorhandenen (schlechten) Datenmodell und dann voraussichtlich auch in der API noch so verknotet weitermachen musst, könntest Du dein Datenmodell überdenken, und die Eigenschaften (Tel, Fax, Mobile, Mail, ...) aus der Waagerechten (dem Datensatz) herausnehmen und in die Senkrechte (eine eigene Tabelle) verfrachten.</p> </blockquote> <p>für diese Anregung hast du von mir schon ein Plus bekommen, zumal dein Beispiel sehr schön zeigt, dass man dann mühelos noch weitere Kontaktmöglichkeiten einbringen kann (hier die Mailadresse).</p> <p>Allerdings würde ich dann dringend raten, die Telefonnummern auch normalisiert zu speichern. Dein Beispielauszug enthält noch verschiedene Trennzeichen. Die würde ich dann komplett rauslöschen.</p> <blockquote> <p>Und plötzlich wären die Zuordnungsprobleme verschwunden.</p> </blockquote> <p>Genau. Wald? Was für'n Wald? Hier sind nur lauter Bäume.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770059#m1770059 LastBoyScout 2020-05-05T07:26:17Z 2020-05-05T07:26:17Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hi Tom,</p> <blockquote> <p>aus der Waagerechten (dem Datensatz) herausnehmen und in die Senkrechte (eine eigene Tabelle) verfrachten.</p> </blockquote> <p>Jetzt hab ich es kapiert... wirklich sehr einleuchtend erklärt DANKE!</p> <p>Nur leider bin ich bez. des Datenbankmodell an die Hauptanwendung gebunden und kann es daher nicht selbst ändern. Somit muss ich mit den Unzulänglichkeiten mittels eines geeigneten Workaround irgendwie zurechtkommen. Bin ja zumindest schon mal froh, das wenigstens keine Duplikate vorhanden sind.</p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770078#m1770078 robertroth robert.r@online.de 2020-05-05T12:02:20Z 2020-05-05T12:06:19Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Liebe Mitdenker, liebe Wissende, liebe Neugierige,</p> <blockquote> <p>n'Abend,</p> <blockquote> <blockquote> <blockquote> <pre><code class="block language-text">clientno type data -------------------------------- 70678 Fax 0531/12345-7 70678 Tel 0531/12345-0 70678 Mail hans@dampf.lan 70678 Mob 0171/555333555 </code></pre> </blockquote> <p>Könntest Du das Bitte perzisieren, stehe da momentan auf dem Schlauch!?</p> </blockquote> <p>Statt dass Du dir einen Krampf in der SQL-Schicht codest mit dem vorhandenen (schlechten) Datenmodell und dann voraussichtlich auch in der API noch so verknotet weitermachen musst, könntest Du dein Datenmodell überdenken, und die Eigenschaften (Tel, Fax, Mobile, Mail, ...) aus der Waagerechten (dem Datensatz) herausnehmen und in die Senkrechte (eine eigene Tabelle) verfrachten.</p> </blockquote> <p>für diese Anregung hast du von mir schon ein Plus bekommen, zumal dein Beispiel sehr schön zeigt, dass man dann mühelos noch weitere Kontaktmöglichkeiten einbringen kann (hier die Mailadresse).</p> <p>Allerdings würde ich dann dringend raten, die Telefonnummern auch normalisiert zu speichern. Dein Beispielauszug enthält noch verschiedene Trennzeichen. Die würde ich dann komplett rauslöschen.</p> </blockquote> <p>Da Speicherplatz nicht mehr sooo teuer ist, baue ich in solchen Fällen immer zwei Datenspalten auf. Eine mit Formatierung (Slashes, Dashes, Umlaute, Nicht-ASCII-Zeichen, Trallala) und eine normalisierte. Die normalisierte wird immer automatisch durch einen Trigger und eine Benutzerfunktion beschrieben, wenn sich in der formatierten etwas ändert. Die normalisierte ist gegen direktes Beschreiben geschützt.</p> <p>Spirituelle Grüße<br> Euer Robert</p> <div class="signature">-- <br> Möge der Forumsgeist ewig leben! </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770068#m1770068 TS ts-self@online.de https://bitworks.de 2020-05-05T10:44:21Z 2020-05-05T10:44:21Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hello,</p> <blockquote> <blockquote> <p>aus der Waagerechten (dem Datensatz) herausnehmen und in die Senkrechte (eine eigene Tabelle) verfrachten. Jetzt hab ich es kapiert... wirklich sehr einleuchtend erklärt DANKE!</p> </blockquote> <p>Nur leider bin ich bez. des Datenbankmodell an die Hauptanwendung gebunden und kann es daher nicht selbst ändern. Somit muss ich mit den Unzulänglichkeiten mittels eines geeigneten Workaround irgendwie zurechtkommen. Bin ja zumindest schon mal froh, das wenigstens keine Duplikate vorhanden sind.</p> </blockquote> <p>Vielleicht kannst Du eine Hilfstabelle aufbauen?<br> Um wieviele Datensätze handelt es sich insgesamt?<br> Wie oft ändert sich der Datenbestand?</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770080#m1770080 LastBoyScout 2020-05-05T12:05:27Z 2020-05-05T12:05:27Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <blockquote> <p>Vielleicht kannst Du eine Hilfstabelle aufbauen?</p> </blockquote> <p>Da ich keine internen Kenntnisse um die Hauptanwendung habe, möchte ich lieber nicht Hand an die Datenbankarchitektur legen. Müsste das dann eher in eine zweite DB auslagern... Nehme dann aber doch lieber einen entsprechenden Workaround in kauf als eine zweite DB zu pflegen.</p> <blockquote> <p>Um wieviele Datensätze handelt es sich insgesamt?</p> </blockquote> <p>Sind so um die 500 Datensätze... Performance spielt daher eher eine untergeordnete rolle.</p> <blockquote> <p>Wie oft ändert sich der Datenbestand?</p> </blockquote> <p>Änderungen sind eigentlich selten. Eher kommen hin und wieder neue Daten hinzu.</p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770083#m1770083 LastBoyScout 2020-05-05T12:11:55Z 2020-05-05T12:11:55Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <blockquote> <p>Da Speicherplatz nicht mehr sooo teuer ist, baue ich in solchen Fällen immer zwei Datenspalten auf. Eine mit Formatierung (Slashes, Dashes, Umlaute, Nicht-ASCII-Zeichen, Trallala) und eine normalisierte.</p> </blockquote> <p>Das ist natürlich der eleganteste Weg, um derartige Unzulänglichkeiten von vornherein zu vermeiden. Wünschte die Urheber der DB würden das mal beherzigen. </p> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770107#m1770107 TS ts-self@online.de https://bitworks.de 2020-05-05T17:58:48Z 2020-05-05T17:59:16Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hello,</p> <blockquote> <p>Da Seicherplatz nicht mehr sooo teuer ist, baue ich in solchen Fällen immer zwei Datenspalten auf. Eine mit Formatierung (Slashes, Dashes, Umlaute, Nicht-ASCII-Zeichen, Trallala) und eine normalisierte. Die normalisierte wird immer automatisch durch einen Trigger und eine Benutzerfunktion beschrieben, wenn sich in der formatierten etwas ändert. Die normalisierte ist gegen direktes Beschreiben geschützt.</p> </blockquote> <p>Genaugenommen muss man Aktionen zu dieser Spalte in <strong>zwei</strong> Triggern vorsehen:</p> <ul> <li>INSERT</li> <li>UPDATE</li> </ul> <p>DELETE kann man sich wohl schenken, wenn die Spalte in derselben Tabelle steht. Wenn man die Information allerdings in eine andere Tabelle auslagert, benötigt man auch einen DELETE-Trigger.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770098#m1770098 Rolf B 2020-05-05T14:12:30Z 2020-05-05T14:13:11Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Hallo LastBoyScout,</p> <p>hast Du keine Leserechte auf der DB, oder <strong>sollst</strong> Du sie einfach nur lesen?</p> <p>Es gibt zwei Möglichkeiten, sich vom DBMS helfen zu lassen, ohne dass die Originalanwendung etwas davon mitbekommt (bis auf minimale Tempoverluste):</p> <p>(1) Ein Update-Trigger, der Änderungen an Fon, Mob und Fax automatisch von Sonderzeichen befreit und den Wert passend in eine andere Tabelle einträgt. Für diese bietet sich dann die bereits vorgeschlagene Struktur an, wo ein Satz immer nur eine Nummer enthält. Der Trigger ist nicht ganz trivial und braucht etwas Logik, er muss ja auch den Satz in der Suchtabelle löschen können, wenn ein Feld geleert wird. Bei Neueintragungen und Änderungen gibt's INSERT mit ON DUPLICATE KEY UPDATE.</p> <p>(2) Ist Dir das zu kompliziert, kann man auch per ALTER TABLE drei materialisierte, berechnete Spalten für Fon, Mob und Fax in die Originaltabelle einsetzen. Die Berechnungsformel kann die REPLACE-Ausdrücke enthalten.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770113#m1770113 robertroth robert.r@online.de 2020-05-05T19:41:01Z 2020-05-05T19:41:01Z mySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben <p>Lieber Tom,</p> <blockquote> <blockquote> <p>Da Seicherplatz nicht mehr sooo teuer ist, baue ich in solchen Fällen immer zwei Datenspalten auf. Eine mit Formatierung (Slashes, Dashes, Umlaute, Nicht-ASCII-Zeichen, Trallala) und eine normalisierte. Die normalisierte wird immer automatisch durch einen Trigger und eine Benutzerfunktion beschrieben, wenn sich in der formatierten etwas ändert. Die normalisierte ist gegen direktes Beschreiben geschützt.</p> </blockquote> <p>Genaugenommen muss man Aktionen zu dieser Spalte in <strong>zwei</strong> Triggern vorsehen:</p> <ul> <li>INSERT</li> <li>UPDATE</li> </ul> </blockquote> <p>Das stimmt wohl. Aber man <s>kann</s> sollte dieselbe benutzerdefinierte Funktion verwenden, die in den beiden Triggern eingebunden wird. Sonst könnte bei Änderungen schnell mal etwas in die Hose gehen.</p> <blockquote> <p>DELETE kann man sich wohl schenken, wenn die Spalte in derselben Tabelle steht. Wenn man die Information allerdings in eine andere Tabelle auslagert, benötigt man auch einen DELETE-Trigger.</p> </blockquote> <p>Der Punkt geht jedenfalls an Dich ;-)</p> <p>Spirituelle Grüße<br> Dein Robert</p> <div class="signature">-- <br> Möge der Forumsgeist ewig leben! </div>