Bestimmte Zeichen bei der Abfrage ignorieren

Werbung:
Weil ich mehrere Tabellen miteinander verknüpft habe.
Ich habe hier nur einen Teil des Scripts gezeigt, der hinsichtlich meiner Anfrage der wichtigste sein muss.

Diese replace-Funktion ersetzt einfach den Eintrag in der Tabelle. Die muss man irgendwie an $suche anpassen, aber ich komme leider nicht an die richtige Lösung.
 
Das von dir gezeigte Query wird in jeder aktuellen SQL Version scheitern, in einem GROUP BY muss jede Spalte entweder aggregiert oder gruppiert werden.

Du schreibst du verknüpfst mehere Tabellen, da steht aber nichts von im Query.

Ein SELECT * FROM tabelle liefert immer das, was in der Tabelle steht, unabhängig davon was im WHERE-Teil abgefragt wird. Mir fallen nur vier Fälle ein warum das nicht so ist:
a) Dein Client unterstützt die Anzeige der Zeichen nicht (bei - unwarscheinlich).
b) GROUP BY macht in deinem Fall was es will, ein MySQL-Feature in der alten Version.
c) Du hast das Query "vereinfacht" dargestellt.
d) Die Daten enthalten einfach diese Zeichen nicht, es wird ja auch nach Datensätzen gesucht in denen kein - und kein | enthalten sind.
 
Also, um mal zu zeigen, die Abfrage prinzipiell geht:

Code:
test=# select * from mikluxo ;
 id |  begriff   
----+-------------
  1 | banane
  3 | Birne
  4 | Zitrone
  5 | Strom|kabel
  2 | Wald-apfel
(5 Zeilen)

test=*# select * from mikluxo where replace(replace(begriff,'|',''),'-','') in( 'Stromkabel', 'Waldapfel');
 id |  begriff   
----+-------------
  5 | Strom|kabel
  2 | Wald-apfel
(2 Zeilen)

Zum GROUP BY: wenn die ID-Spalte der Primary Key ist, kann das u.U. die DB erkennen:

Code:
test=*# select * from mikluxo where replace(replace(begriff,'|',''),'-','') in( 'Stromkabel', 'Waldapfel') group by id;
 id |  begriff   
----+-------------
  2 | Wald-apfel
  5 | Strom|kabel
(2 Zeilen)

Entferne ich den Primary Key - Constraint, falle ich auf die Nase:

Code:
test=*# alter table mikluxo drop constraint mikluxo_pkey ;
ALTER TABLE
test=*# select * from mikluxo where replace(replace(begriff,'|',''),'-','') in( 'Stromkabel', 'Waldapfel') group by id;
FEHLER:  Spalte »mikluxo.begriff« muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden
ZEILE 1: select * from mikluxo where replace(replace(begriff,'|',''),...
  ^
test=*#

Wie @ukulele schon sagte: etwas länger abgehangene Versionen von MySQL haben hier das nicht wirklich tolle Feature, statt dem richtigen Ergebniss (was nur eine Fehlermeldung sein kann) irgend etwas falsches anzuzeigen.


Also, die Lösung von @ukulele sollte durchaus funktionieren, aber bei etwas größeren Datenmemengen hast halt mit Deiner Primitiv-Gefrickel-Datenbank relativ schlechte Karten, weil da kein Index wird greifen können. Die Lösung von ihm ließe sich dafür aber sogar in PG anwenden, man kann da auch einen funktionalen Index auf dieses replace(...) - Gedöhns machen (funktionale Indexe kann MySQL auch nicht) oder aber wie gezeigt mit der trgm-Extension:

Code:
test=*# explain select *, similarity (begriff, 'Waldapfel') as "Waldapfel", similarity(begriff,'Stromkabel') as "Stromkabel" from mikluxo where begriff % 'Waldapfel' or begriff % 'Stromkabel';
  QUERY PLAN   
-----------------------------------------------------------------------------------
 Bitmap Heap Scan on mikluxo  (cost=8.28..12.30 rows=1 width=36)
  Recheck Cond: ((begriff % 'Waldapfel'::text) OR (begriff % 'Stromkabel'::text))
  ->  BitmapOr  (cost=8.28..8.28 rows=1 width=0)
  ->  Bitmap Index Scan on trgm_index  (cost=0.00..4.14 rows=1 width=0)
  Index Cond: (begriff % 'Waldapfel'::text)
  ->  Bitmap Index Scan on trgm_index  (cost=0.00..4.14 rows=1 width=0)
  Index Cond: (begriff % 'Stromkabel'::text)
(7 Zeilen)
 
Ihr habt Recht.
Ich hatte einen kleinen "Fehler" im Code, und das hat nichts mit GROUP BY zu tun. Ich habe nämlich in der Tabelle immer noch eine weitere Spalte, in der die genannten Begriffe ohne die angeführten Zeichen stehen. Leider hatte ich vergessen, bei "echo" den Spaltennamen zu ändern. Das habe ich korrigiert und der Code funktioniert tatsächlich. Aber ein Problem bleibt trotzdem, wie ich vorher auch erwähnt habe: Die Begriffe werden jetzt nur dann ausgegeben, wenn diese ohne Zeichen in das Suchfeld eingegeben werden. Gibt man sie dagegen zusammen mit dem Zeichen ein, werden sie nicht mehr angesprochen. Zur Veranschaulichung und der Einfachheit halber habe ich eine andere kleine Tabelle erstellt (ohne jegliche Verknüpfungen):


si53ibf8.jpg



$abfrage = "SELECT * FROM tabelle
WHERE replace(replace(wort,'|',''),'-','') LIKE '$suche'";
$ergebnis = mysqli_query($db_connect, $abfrage);

while ($zeile = mysqli_fetch_array ($ergebnis, MYSQLI_ASSOC))
{
echo $zeile['wort'];
}

ontuxcjz.jpg


2mdgz8uq.jpg

Wenn die Abfrage in beiden Fällen funktionieren würde, wäre das super.

Ferner habe ich eine Frage bezüglich der Volltextsuche. Aber das frage ich später (falls ich euch nicht zu sehr belästige :))

Übrigens ist die Version von Mysql: 5.5.52 cll
PHP Version: 5.4.43
 
Also wenn ich das richtig verstehe müsste das hier Abhilfe schaffen:
Code:
SELECT * FROM tabelle WHERE replace(replace(spalte,'|',''),'-','') LIKE replace(replace('$suche','|',''),'-','')
Der Geschwindigkeit wird das natürlich nicht helfen :)
 
Werbung:
Deine Ergänzung funktioniert nicht, aber ich füge einfach ein

OR wort LIKE '$suche'

und das geht.
Als Anfänger hat man immer so kleine Probleme.

Vielen Dank nochmal für eure Hilfe.
 
Zurück
Oben