tag:forum.selfhtml.org,2005:/selfmySQL Bei Suche über mehrer Spalten auch den Feldnamen des Treffer ausgeben – SELFHTML-Forum2020-05-05T19:41:01Zhttps://forum.selfhtml.org/self/2020/may/04/mysql-bei-suche-uber-mehrer-spalten-auch-den-feldnamen-des-treffer-ausgeben/1770021#m1770021LastBoyScout2020-05-04T15:36:47Z2020-05-04T15:36:47ZmySQL 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#m1770023MudGuardhttp://www.andreas-waechter.de/2020-05-04T15:44:19Z2020-05-04T15:44:19ZmySQL 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#m1770025TSts-self@online.dehttps://bitworks.de2020-05-04T15:50:53Z2020-05-04T15:51:28ZmySQL 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#m1770027Rolf B2020-05-04T15:52:15Z2020-05-04T15:52:15ZmySQL 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#m1770024MudGuardhttp://www.andreas-waechter.de/2020-05-04T15:49:13Z2020-05-04T15:49:13ZmySQL 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#m1770026LastBoyScout2020-05-04T15:51:07Z2020-05-04T15:51:07ZmySQL 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#m1770028LastBoyScout2020-05-04T15:58:19Z2020-05-04T15:58:19ZmySQL 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#m1770029LastBoyScout2020-05-04T16:02:59Z2020-05-04T16:02:59ZmySQL 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#m1770031LastBoyScout2020-05-04T16:11:03Z2020-05-04T16:11:03ZmySQL 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#m1770030Rolf B2020-05-04T16:04:33Z2020-05-04T16:04:33ZmySQL 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#m1770037TSts-self@online.dehttps://bitworks.de2020-05-04T17:41:50Z2020-05-04T17:41:50ZmySQL 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#m1770032LastBoyScout2020-05-04T16:16:23Z2020-05-04T16:16:23ZmySQL 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#m1770033Der Martin2020-05-04T16:16:31Z2020-05-04T16:16:31ZmySQL 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#m1770034dedlfix2020-05-04T16:17:48Z2020-05-04T16:17:48ZmySQL 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#m1770035Rolf B2020-05-04T16:19:01Z2020-05-04T16:19:01ZmySQL 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#m1770036LastBoyScout2020-05-04T16:26:57Z2020-05-04T16:28:55ZmySQL 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#m1770038Der Martin2020-05-04T17:49:32Z2020-05-04T17:49:32ZmySQL 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#m1770059LastBoyScout2020-05-05T07:26:17Z2020-05-05T07:26:17ZmySQL 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#m1770078robertrothrobert.r@online.de2020-05-05T12:02:20Z2020-05-05T12:06:19ZmySQL 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#m1770068TSts-self@online.dehttps://bitworks.de2020-05-05T10:44:21Z2020-05-05T10:44:21ZmySQL 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#m1770080LastBoyScout2020-05-05T12:05:27Z2020-05-05T12:05:27ZmySQL 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#m1770083LastBoyScout2020-05-05T12:11:55Z2020-05-05T12:11:55ZmySQL 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#m1770107TSts-self@online.dehttps://bitworks.de2020-05-05T17:58:48Z2020-05-05T17:59:16ZmySQL 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#m1770098Rolf B2020-05-05T14:12:30Z2020-05-05T14:13:11ZmySQL 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#m1770113robertrothrobert.r@online.de2020-05-05T19:41:01Z2020-05-05T19:41:01ZmySQL 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>