MySQL SELECT "reverse" Wildcard

  • Thread starter Thread starter Deleted member 11691
  • Start date Start date
D

Deleted member 11691

Guest
Hallo,

ich muss folgendes machen:

In die Datenbank kommt ein Eintrag, welcher "http://google.de/*" heißt und einen der "http://abc.de/123*" heißt. Wenn ich nun per SELECT die Daten "http://google.de/", "http://google.de/test", etc. bzw. "http://abc.de/123", "http://abc.de/123?rofl&lol", "http://abc.de/123_back.php", etc. abfrage, soll er mir den jeweiligen Datensatz (wie die beiden oben genannten) ausgeben. Er soll also ein Wildcard wie
Code:
SELECT * FROM `tabelle` WHERE `spalte` = 'http://abc.de/123%';
ausführen, jedoch genau anders rum:
Code:
SELECT * FROM `tabelle` WHERE `spalte` = 'http://abc.de/12345'
soll den Eintrag "http://abc.de/123*" liefern. Ich hab echt keinen Lösungsansatz wie ich das machen soll :( Hoffe, dass mir hier jemand helfen kann ...

L.G. PCFreund
 
Wie gesagt. Like ist genau das, was ich nicht suche. Ich suche ja eben das Gegenteil von Like:

Tabelle "tabelle":
Code:
id | url
---+-------------------------
1  | *google.de/?q=*
2  | http://abc.de/*

Nun möchte ich folgendes machen:
Code:
SELECT `id` FROM `tabelle` WHERE `url` = '[u]http://www.[/u][b]google.de/?q=[/b][u]test[/u]'
liefert den Eintrag 1.
Code:
SELECT `id` FROM `tabelle` WHERE `url` = '[b]http://abc.de/[/b][u]index.html[/u]'
liefert den Eintrag 2.
Code:
SELECT `id` FROM `tabelle` WHERE `url` = '[u][b]http://abc.de/[/b]?url=[b]google.de/?q=[/b][/u]'
liefert den Eintrag 1 und 2.
Die unterstrichenen Bereiche sind die, welche auf das Wildcard treffen, welches in der Tabelle steht. Die dickgeschriebenen Bereiche sind die, welche explizit gefunden werden.
 
Korrekt wäre, die Eingaben in deiner Anwendung zu normalisieren und dann die Abfragen entsprechend zu gestalten.

Was du direkt vorhast, geht allerdings auch mit (My)SQL:
Code:
$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.18-log Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database `test`;
Query OK, 1 row affected (0.00 sec)

mysql> use test;
Database changed
mysql> create table `test` ( url varchar(255) );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into `test` values ('%google.de/?q=%'), ('http://serversupportforum.de/%');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from `test`;
+--------------------------------+ 
| url                            |
+--------------------------------+
| %google.de/?q=%                |
| http://serversupportforum.de/% |
+--------------------------------+ 
2 rows in set (0.00 sec)

mysql> select * from `test` where 'http://www.google.de/?q=test' like url;
+-----------------+
| url             |
+-----------------+
| %google.de/?q=% |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from `test` where 'http://serversupportforum.de/?url=google.de/?=' like url;
+--------------------------------+
| url                            |
+--------------------------------+
| http://serversupportforum.de/% |
+--------------------------------+
1 row in set (0.00 sec)

mysql> select * from `test` where 'http://serversupportforum.de/?url=google.de/?q=' like url;
+--------------------------------+
| url                            |
+--------------------------------+
| %google.de/?q=%                |
| http://serversupportforum.de/% |
+--------------------------------+
2 rows in set (0.00 sec)
 
Wieso speicherst du die oben angedachten Werte nicht "als" reguläre Ausdrücke in der Datenbank und bei einem Check vergleichst du den Eingabestring mit dem jeweiligen regulären Ausdruck aus der Datenbank. Bei einem Matching machst du dann natürlich nicht weiter, weil du ja schon einen Treffer hast.

Da musst du nichts mit stored procedures oder mit aufgeblähten Datenbanken machen.

Eine Skriptsprache deiner Wahl wird das ja wohl können ;)
 
Danke an alle und besonders Roger Wilco. Deine Lösung hat mich nun viel weiter gebracht. Ich dachte das wäre sehr viel schwerer, als du es geschrieben hast :o

L.G. PCFreund
 
Nur als Zusatz;
wenn die gespeicherte URL noch keine Wildcard-Platzhalter hat, kann man mittels CONCAT() bei Ausfuehrung des Queries Platzhalter an einen Eintrag 'ankleben' und somit matchen lassen.
 
Back
Top