Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 30.05.2007 19:08:29 von FrankImGlueck

Hallo liebe NetzGemeinde,

ich habe zwei Tabellen, Tabelle1 und Tabelle2. In Tabelle1 befinden sich
ältere Einträge mit Dateinamen, die auf z.T. geänderte, in Tabelle2
befindliche Dateinamen (mit kompletten Pfadangaben, wobei der Dateiname ab
Zeichen 26 beginnt) überprüft werden sollen. Falls in Tabelle1 ein Eintrag
gefunden wird, bei dem der Wert des Feldes "Dateiname" in keinem der Werte
des Tabelle2-Feldes "PfadMitDateiname" eine Entsprechung findet, soll mir
dieser Datensatz angezeigt werden.

Mit der folgenden Abfrage sollte dies eigentlich funktionieren:

SELECT * FROM `Tabelle1`,`Tabelle2` WHERE Tabelle1.Dateiname !=
substring(Tabelle2.PfadMitDateiname FROM 26)

Da aber Tabelle1 über 3.000 und Tabelle2 über 6.000 Einträge enthält, dauert
die Abfrage erwartungsgemäß viel zu lange. Fiele jemandem eine Lösung ein,
wie es weniger performant ginge?

Danke und schöne Grüße,
Frank

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 30.05.2007 19:53:27 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zweiTabellen?

am 30.05.2007 19:59:45 von B.Steinbrink

On Wed, 30 May 2007 19:08:29 +0200, Frank Glck wrote:

> Hallo liebe NetzGemeinde,

Hallo Herr Glck,

falls ihnen ein Umlaut in Ihrem Namen fehlt, richten Sie bitte Ihren
Newsreader vernünftig ein, der mag uns momentan nicht mitteilen welchen
Zeichensatz sie uns denn hier präsentieren :-P

> ich habe zwei Tabellen, Tabelle1 und Tabelle2. In Tabelle1 befinden sich
> ltere Eintrge mit Dateinamen, die auf z.T. genderte, in Tabelle2
> befindliche Dateinamen (mit kompletten Pfadangaben, wobei der Dateiname
> ab Zeichen 26 beginnt) berprft werden sollen. Falls in Tabelle1 ein
> Eintrag gefunden wird, bei dem der Wert des Feldes "Dateiname" in keinem
> der Werte des Tabelle2-Feldes "PfadMitDateiname" eine Entsprechung
> findet, soll mir dieser Datensatz angezeigt werden.
>
> Mit der folgenden Abfrage sollte dies eigentlich funktionieren:
>
> SELECT * FROM `Tabelle1`,`Tabelle2` WHERE Tabelle1.Dateiname !=
> substring(Tabelle2.PfadMitDateiname FROM 26)

Nein, die Bedingung gilt je Kombination der Reihen aus Tabelle1 und
Tabelle2, d.h. du wirst so um die 18 Millionen Ergebnisse erhalten (falls
T1.Dateiname maximal mit einem T2.PfadMitDateiname übereinstimmt, was mir
aber wahrscheinlich erscheint)

> Da aber Tabelle1 ber 3.000 und Tabelle2 ber 6.000 Eintrge enthlt, dauert
> die Abfrage erwartungsgem viel zu lange. Fiele jemandem eine Lsung ein,
> wie es weniger performant ginge?

Noch weniger? o.O Da fiele mir eine Menge ein... ;-)

Für kürzere Ausführungszeiten hingegen hat das Handbuch zu bieten:
http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists -
subqueries.html

Oder alternativ ein LEFT JOIN nebst IS NULL, dass funktioniert dann sogar
mit prähistorischen MySQL Versionen.

Björn

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 31.05.2007 00:36:17 von FrankImGlueck

Hallo Björn,

"Björn Steinbrink" schrieb
> On Wed, 30 May 2007 19:08:29 +0200, Frank Glck wrote:
>
>> Hallo liebe NetzGemeinde,
>
> Hallo Herr Glck,
>
> falls ihnen ein Umlaut in Ihrem Namen fehlt, richten Sie bitte Ihren
> Newsreader vernünftig ein, der mag uns momentan nicht mitteilen welchen
> Zeichensatz sie uns denn hier präsentieren :-P

Jetzt besser?

> Für kürzere Ausführungszeiten hingegen hat das Handbuch zu bieten:
> http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists -
> subqueries.html

Ok, ich gehe also davon aus, dass NOT EXISTS mir hier genauso wenig
weiterhelfen wird ...(?)

> Oder alternativ ein LEFT JOIN nebst IS NULL, dass funktioniert dann sogar
> mit prähistorischen MySQL Versionen.

Aber wie? Wie sich sicher nicht verbergen lässt, fühle ich mich noch nicht
ganz heimisch in mySQL, sorry. ;-)

Habe folgendes probiert, was aber ebenfalls zu lange dauerte und mir in
phpMyAdmin am Ende doch nur eine (fehlerhafte) leere Seite auswarf:

SELECT DISTINCT * FROM Tabelle1 LEFT JOIN Tabelle2 ON Tabelle1.Dateiname not
like substring(Tabelle2.PfadMitDateiname, 26)

Wo wäre hier evtl. noch das "IS NULL" einzubauen?

Danke und Grüße,
Frank

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 31.05.2007 00:52:09 von Axel Schwenke

=?iso-8859-1?b?Qmr2cm4=?= Steinbrink wrote:
>
> Oder alternativ ein LEFT JOIN nebst IS NULL, dass funktioniert dann sogar
> mit prähistorischen MySQL Versionen.

Und wenn man es schnell haben will, dreht man vor der Abfrage alle
Strings um (REVERSE()). Dann wird die WHERE Bedingung im JOIN ein
Prefix-Match und kann einen Index verwenden:

CREATE TEMPORARY TABLE t1 AS SELECT REVERSE(Dateiname) AS c1 ...
CREATE TEMPORARY TABLE t2 AS SELECT REVERSE(Pfad) AS c1 ...
ALTER TABLE t2 ADD INDEX USING BTREE (c1)
SELECT REVERSE(t1.c1) AS Dateiname FROM t1 LEFT JOIN t2
ON t2.c1 LIKE CONCAT(t1.c1, '%')
WHERE t2.c1 IS NULL


XL

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zweiTabellen?

am 31.05.2007 01:11:25 von B.Steinbrink

On Thu, 31 May 2007 00:52:09 +0200, Axel Schwenke wrote:

> =?iso-8859-1?b?Qmr2cm4=?= Steinbrink wrote:
>>
>> Oder alternativ ein LEFT JOIN nebst IS NULL, dass funktioniert dann
>> sogar mit prähistorischen MySQL Versionen.
>
> Und wenn man es schnell haben will, dreht man vor der Abfrage alle
> Strings um (REVERSE()). Dann wird die WHERE Bedingung im JOIN ein
> Prefix-Match und kann einen Index verwenden:
>
> CREATE TEMPORARY TABLE t1 AS SELECT REVERSE(Dateiname) AS c1 ... CREATE
> TEMPORARY TABLE t2 AS SELECT REVERSE(Pfad) AS c1 ... ALTER TABLE t2 ADD
> INDEX USING BTREE (c1) SELECT REVERSE(t1.c1) AS Dateiname FROM t1 LEFT
> JOIN t2
> ON t2.c1 LIKE CONCAT(t1.c1, '%')
> WHERE t2.c1 IS NULL

Ah richtig, bei dem "FROM 26" hat mein Hirn scheinbar auf "weniger
performant" geschaltet ;-)

Danke
Björn

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zweiTabellen?

am 31.05.2007 01:20:38 von B.Steinbrink

Nabend Frank,

On Thu, 31 May 2007 00:36:17 +0200, Frank Glck wrote:

> Hallo Bjrn,
>
> "Bjrn Steinbrink" schrieb
>> On Wed, 30 May 2007 19:08:29 +0200, Frank Glck wrote:
>>
>>> Hallo liebe NetzGemeinde,
>>
>> Hallo Herr Glck,
>>
>> falls ihnen ein Umlaut in Ihrem Namen fehlt, richten Sie bitte Ihren
>> Newsreader vernnftig ein, der mag uns momentan nicht mitteilen welchen
>> Zeichensatz sie uns denn hier prsentieren :-P
>
> Jetzt besser?

Nein, immer noch kein Header mit Zeichensatzinfos. :-(

>> Fr krzere Ausfhrungszeiten hingegen hat das Handbuch zu bieten:
>> http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists -
>> subqueries.html
>
> Ok, ich gehe also davon aus, dass NOT EXISTS mir hier genauso wenig
> weiterhelfen wird ...(?)

Beim NOT EXISTS Subquery wird geschaut ob in Tabelle2 kein Eintrag
existiert und nicht mehr jede Zeilenkombination aus beiden Tabellen
gebildet, im FROM taucht dann nur Tabelle1 (bzw. im Subquery Tabelle2
auf).

>> Oder alternativ ein LEFT JOIN nebst IS NULL, dass funktioniert dann
>> sogar mit prhistorischen MySQL Versionen.
>
> Aber wie? Wie sich sicher nicht verbergen lsst, fhle ich mich noch nicht
> ganz heimisch in mySQL, sorry. ;-)
>
> Habe folgendes probiert, was aber ebenfalls zu lange dauerte und mir in
> phpMyAdmin am Ende doch nur eine (fehlerhafte) leere Seite auswarf:
>
> SELECT DISTINCT * FROM Tabelle1 LEFT JOIN Tabelle2 ON Tabelle1.Dateiname
> not like substring(Tabelle2.PfadMitDateiname, 26)

Die leere Seite resultiert wohl aus überlanger Laufzeit, mit dem
Kommandozeilenclient passiert sowas nicht ;-)

> Wo wre hier evtl. noch das "IS NULL" einzubauen?

Beim LEFT JOIN willst du auch auf Gleichheit testen, dass heisst dann,
dass wenn keine Zeile in Tabelle2 gefunden wird, die "passt", dann werden
die Felder aus Tabelle2 zu "NULL" im Ergebnis. Und genau danach suchst
du, also WHERE Tabelle2.notNullFeld IS NULL.

Das Feld für die IS NULL Bedingung muss IIRC als "NOT NULL" definiert
sein, damit MySQL das als "Not Exists" Query erkennt (ersichtlich in der
EXPLAIN Ausgabe).

Eine optimale Lösung findet sich jetzt ja auch nebenan in Axels
Beitrag :-)

Björn

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 31.05.2007 11:02:21 von FrankImGlueck

Hallo Axel,

"Axel Schwenke" schrieb im Newsbeitrag
> =?iso-8859-1?b?Qmr2cm4=?= Steinbrink wrote:
>>
>> Oder alternativ ein LEFT JOIN nebst IS NULL, dass funktioniert dann sogar
>> mit prähistorischen MySQL Versionen.
>
> Und wenn man es schnell haben will, dreht man vor der Abfrage alle
> Strings um (REVERSE()). Dann wird die WHERE Bedingung im JOIN ein
> Prefix-Match und kann einen Index verwenden:
>
> CREATE TEMPORARY TABLE t1 AS SELECT REVERSE(Dateiname) AS c1 ...
> CREATE TEMPORARY TABLE t2 AS SELECT REVERSE(Pfad) AS c1 ...
> ALTER TABLE t2 ADD INDEX USING BTREE (c1)
> SELECT REVERSE(t1.c1) AS Dateiname FROM t1 LEFT JOIN t2
> ON t2.c1 LIKE CONCAT(t1.c1, '%')
> WHERE t2.c1 IS NULL

vielen Dank, das ist sicher sehr professionell, aber sorry, ich schaue da
leider im Moment noch etwas wie das Schwein ins Uhrwerk. Ich verstehe die
Abfrage so, dass für meinen Zweck extra zwei temporäre Tabellen namens t1
und t2 angelegt werden, die beide jeweils die entsprechende Spalte aus den
eigentlichen Tabellen mit umgekehrter Zeichenfolge zugewiesen bekommen
(sollen). Aber wofür steht an diesen Stellen jeweils das "AS c1 ..."? Kommt
dort die Bezeichnung meiner ersten Ursprungsspalte, also "AS
Tabelle1.Dateiname" hin? Müsste dann aber nicht beim zweiten "AS c1 ..."
auch die zweite Ursprungsspalte, also "AS Tabelle2.PfadMitDateiname",
eingesetzt werden? Leider finde ich - wie vieles bei MySQL - auch das
"BTREE" nirgends so richtig dokumentiert, immer nur mal so am Rande mit
erwähnt ... Also ich verändere nun im nächsten Schritt meine temporäre t2,
indem ich ihr einen Index über ihre einzige Spalte hinzufüge? Und dann lese
ich die Werte aus der Spalte meiner ersten temporären Tabelle rückwärts
wieder aus, unter der Bedingung, dass sie zusammen mit einem angehängten
Joker-String keine Entsprechung mit den Werten in der Spalte meiner 2.
temporären Tabelle finden?

Tut mir leid, dass ich so genau nachhake, bevor ich das Statement einfach
mal abschicke, aber bis jetzt bin ich mir noch nicht sicher, dass ich alles
richtig verstanden habe und deshalb auch nichts schief gehen kann. Sind t1
und t2 in Deinem Beispiel also wirklich die von Dir vergebenen Namen für die
beiden temporären Tabellen, oder muss ich hier diejenigen meiner
Ursprungstabellen eintragen?

Apropos: Gibt es nicht mal irgendwo eine "wirklich gute" Dokumentation im
Netz, und ich meine gerade nicht die englische oder deutsche Original-Doku
von www.mysql.de, die hier und da IMHO schon verdammt viele Vorkenntnisse
voraussetzt.

Vielen Dank nochmal für Deine Mühe,
Und Grüße, Frank

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 31.05.2007 11:09:46 von FrankImGlueck

Hallo Björn,

"Björn Steinbrink" schrieb
>>> falls ihnen ein Umlaut in Ihrem Namen fehlt, richten Sie bitte Ihren
>>> Newsreader vernnftig ein, der mag uns momentan nicht mitteilen welchen
>>> Zeichensatz sie uns denn hier prsentieren :-P
>>
>> Jetzt besser?
>
> Nein, immer noch kein Header mit Zeichensatzinfos. :-(

Hmm, weiß nicht, wie ich das bei meinem Outlook Express ändern kann, tut mir
leid. Mir scheint, das geht hier überhaupt nicht(?) Als Zeichensatz hatte
ich nun UTF-8 eingestellt.

> Beim NOT EXISTS Subquery wird geschaut ob in Tabelle2 kein Eintrag
> existiert und nicht mehr jede Zeilenkombination aus beiden Tabellen
> gebildet, im FROM taucht dann nur Tabelle1 (bzw. im Subquery Tabelle2
> auf).
>
>>> Oder alternativ ein LEFT JOIN nebst IS NULL, dass funktioniert dann
>>> sogar mit prhistorischen MySQL Versionen.
>>
>> Aber wie? Wie sich sicher nicht verbergen lsst, fhle ich mich noch nicht
>> ganz heimisch in mySQL, sorry. ;-)
>>
>> Habe folgendes probiert, was aber ebenfalls zu lange dauerte und mir in
>> phpMyAdmin am Ende doch nur eine (fehlerhafte) leere Seite auswarf:
>>
>> SELECT DISTINCT * FROM Tabelle1 LEFT JOIN Tabelle2 ON Tabelle1.Dateiname
>> not like substring(Tabelle2.PfadMitDateiname, 26)
>
> Die leere Seite resultiert wohl aus überlanger Laufzeit, mit dem
> Kommandozeilenclient passiert sowas nicht ;-)
>
>> Wo wre hier evtl. noch das "IS NULL" einzubauen?
>
> Beim LEFT JOIN willst du auch auf Gleichheit testen, dass heisst dann,
> dass wenn keine Zeile in Tabelle2 gefunden wird, die "passt", dann werden
> die Felder aus Tabelle2 zu "NULL" im Ergebnis. Und genau danach suchst
> du, also WHERE Tabelle2.notNullFeld IS NULL.

Ja, aber die beiden zu vergleichenden Felder enthalten wie ja wie gesagt
auch unterschiedliche Zeichenmengen, in dem einen steht eben nur der
Dateiname und in dem anderen auch der Pfad. Also brauche ich doch schon noch
etwas wie concat() oder substring, je nachdem von welcher Seite aus ich das
Ganze betrachte(?) Aber genau dort haperts bei mir offenbar noch, denn meine
nun abgeänderte Klausel

WHERE SUBSTRING(Tabelle2.PfadMitDateiname FROM 26) IS NULL

.... will so richtig auch nicht funktionieren.

> Eine optimale Lösung findet sich jetzt ja auch nebenan in Axels
> Beitrag :-)

.... mit der ich als MySQL-Anfänger aber bislang leider auch noch nichts
anfangen kann ...:-(

Danke und Grüße,
Frank

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 31.05.2007 14:21:49 von Christian Kirsch

Am 31.05.2007 11:09 schrieb Frank Glück:

>> Nein, immer noch kein Header mit Zeichensatzinfos. :-(
>
> Hmm, weiß nicht, wie ich das bei meinem Outlook Express ändern kann, tut mir

Man könnte, wenn man nicht weiß, wie man fehlerhafte Software
konfiguriert, ja einfach mal korrekt funktionierende benutzen.
Thunderbird z.B. existiert auch für Windoze.

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 31.05.2007 14:28:12 von Christian Kirsch

Am 31.05.2007 11:02 schrieb Frank Glück:
> Hallo Axel,
>
> "Axel Schwenke" schrieb im Newsbeitrag
>> =?iso-8859-1?b?Qmr2cm4=?= Steinbrink wrote:
>>> Oder alternativ ein LEFT JOIN nebst IS NULL, dass funktioniert dann sogar
>>> mit prähistorischen MySQL Versionen.
>> Und wenn man es schnell haben will, dreht man vor der Abfrage alle
>> Strings um (REVERSE()). Dann wird die WHERE Bedingung im JOIN ein
>> Prefix-Match und kann einen Index verwenden:
>>
>> CREATE TEMPORARY TABLE t1 AS SELECT REVERSE(Dateiname) AS c1 ...
>> CREATE TEMPORARY TABLE t2 AS SELECT REVERSE(Pfad) AS c1 ...
>> ALTER TABLE t2 ADD INDEX USING BTREE (c1)
>> SELECT REVERSE(t1.c1) AS Dateiname FROM t1 LEFT JOIN t2
>> ON t2.c1 LIKE CONCAT(t1.c1, '%')
>> WHERE t2.c1 IS NULL
>
> vielen Dank, das ist sicher sehr professionell, aber sorry, ich schaue da
> leider im Moment noch etwas wie das Schwein ins Uhrwerk. Ich verstehe die
> Abfrage so, dass für meinen Zweck extra zwei temporäre Tabellen namens t1
> und t2 angelegt werden, die beide jeweils die entsprechende Spalte aus den
> eigentlichen Tabellen mit umgekehrter Zeichenfolge zugewiesen bekommen
> (sollen). Aber wofür steht an diesen Stellen jeweils das "AS c1 ..."? Kommt

Das ist Standard-SQL. Sowas kann man z.B. durch Lektüre eines
SQL-Buchs klären. Da Du Dich ohnehin mit MySQL beschäftigst, böte sich
da z.B. Koflers MySQL5 an. Oder vielleicht einfach mal das klassische
RTFM - bei dev.mysql.com gibt es die sehr nützliche Dokumentation zu
MySQL online zu lesen. Sie enthält auch ein Tutorial.

Die klassische Frage, warum jemand so komplexe Dinge tun will wie Du,
ohne auch nur die Grundlagen von SQL verstanden zu kennen, verkneife
ich mir mal.

> Tut mir leid, dass ich so genau nachhake, bevor ich das Statement einfach
> mal abschicke, aber bis jetzt bin ich mir noch nicht sicher, dass ich alles
> richtig verstanden habe und deshalb auch nichts schief gehen kann.

Wie gesagt: Standard-SQL. Ich bezweifle, dass Dir hier jemand die
Lektüre eines Buchs oder der Dokumentation abnimmt. Und dass die nicht
erklären würde, wie CREATE TABLE, ALTER TABLE und SELECT
funktionieren, glaube ich nicht.


> Apropos: Gibt es nicht mal irgendwo eine "wirklich gute" Dokumentation im
> Netz, und ich meine gerade nicht die englische oder deutsche Original-Doku
> von www.mysql.de, die hier und da IMHO schon verdammt viele Vorkenntnisse
> voraussetzt.

S.o. Lies den Kofler. Es gibt natürlich auch (My)SQL-Kurse.

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 01.06.2007 00:36:20 von Axel Schwenke

"Frank Glück" wrote:
> Hallo Axel,
>
> "Axel Schwenke" schrieb
>>
>> CREATE TEMPORARY TABLE t1 AS SELECT REVERSE(Dateiname) AS c1 ...
>> CREATE TEMPORARY TABLE t2 AS SELECT REVERSE(Pfad) AS c1 ...
>> ALTER TABLE t2 ADD INDEX USING BTREE (c1)
>> SELECT REVERSE(t1.c1) AS Dateiname FROM t1 LEFT JOIN t2
>> ON t2.c1 LIKE CONCAT(t1.c1, '%')
>> WHERE t2.c1 IS NULL
>
> vielen Dank, das ist sicher sehr professionell, aber sorry, ich schaue da
> leider im Moment noch etwas wie das Schwein ins Uhrwerk. Ich verstehe die
> Abfrage so, dass für meinen Zweck extra zwei temporäre Tabellen namens t1
> und t2 angelegt werden ...

Jo mei, dös war halt aan Beispül. Eventuell willst du ja lieber deine
Original-Tabellen um eine Spalte mit dem umgedrehten String erweitern.
Oder du drehst die Spalten vor der Query um und danach wieder zurück.
Oder du speicherst prinzipiell die Strings "verkehrt" herum.

> Aber wofür steht an diesen Stellen jeweils das "AS c1 ..."?

Bei CREATE TABLE ... SELECT bekommt die neue Tabelle die Spaltennamen
aus dem SELECT. Da ist es schon sinnvoll, bei längeren Ausdrücken im
SELECT einen Alias zu verwenden. Sonst hast du nachher eine Spalte,
die `REVERSE(Dateiname)` heißt.

> Leider finde ich - wie vieles bei MySQL - auch das
> "BTREE" nirgends so richtig dokumentiert, immer nur mal so am Rande mit
> erwähnt ...

http://dev.mysql.com/doc/refman/5.0/en/alter-table.html

alter_specification:
...
ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...)

index_type:
USING {BTREE | HASH}

tatsächlich hätte man das USING BTREE weglassen können, aber irgendwie
war ich der Überzeugung, eine temporäre Tabelle wäre immer eine MEMORY
Tabelle und da ist der Standard-Index ein Hash und wird nur für Tests
auf Gleichheit verwendet.

> Also ich verändere nun im nächsten Schritt meine temporäre t2,
> indem ich ihr einen Index über ihre einzige Spalte hinzufüge?

Der Index ist das entscheidende. Der macht die Query nachher schnell.

> Und dann lese
> ich die Werte aus der Spalte meiner ersten temporären Tabelle rückwärts
> wieder aus, unter der Bedingung, dass sie zusammen mit einem angehängten
> Joker-String keine Entsprechung mit den Werten in der Spalte meiner 2.
> temporären Tabelle finden?

Jep. Das rückwärts auslesen nur deshalb, damit man wieder den Original-
String bekommt. Wenn man eine ID hätte (wäre in einer normalisierten
Datenbank zu erwarten) dann hätte man wohl besser die genommen.

Wie bereits gesagt, es ging mir darum, das Prinzip darzulegen.

> Tut mir leid, dass ich so genau nachhake, bevor ich das Statement einfach
> mal abschicke, aber bis jetzt bin ich mir noch nicht sicher, dass ich alles
> richtig verstanden habe und deshalb auch nichts schief gehen kann. Sind t1
> und t2 in Deinem Beispiel also wirklich die von Dir vergebenen Namen für die
> beiden temporären Tabellen, oder muss ich hier diejenigen meiner
> Ursprungstabellen eintragen?

t1 und t2 sind "beliebige" Tabellen-Bezeichner und c1 ist ein
"beliebiger" Spaltename (t = Table, c = Column).

> Apropos: Gibt es nicht mal irgendwo eine "wirklich gute" Dokumentation im
> Netz, und ich meine gerade nicht die englische oder deutsche Original-Doku
> von www.mysql.de, die hier und da IMHO schon verdammt viele Vorkenntnisse
> voraussetzt.

Die MySQL-Doku geht naturgemäß auf Besonderheiten von MySQL ein und
setzt grundlegende Kenntnisse von relationalen Datenbanken und SQL
voraus. Für letzteres schnapp dir mal lieber ein Buch. Irgendwas mit
"relationale Datenbanken" und "Einführung" sollte es tun.


XL

Re: Schlanke Ungleich-Abfrage zwischen (Sub-)Strings in zwei Tabellen?

am 02.06.2007 00:58:39 von FrankImGlueck

Hallo Axel,

"Axel Schwenke" schrieb
[... sehr viel Hilfreiches]

nochmals besten Dank, hab Dein Codebeispiel nach etlichen
Learning-by-doing-Anpassungen tatsächlich einigermaßen gefressen und am Ende
sogar noch das gewünschte Ergebnis erzielt! ;-) Aber LEFT JOIN war wohl auch
nicht gerade ein Einstiegsthema ... Wie gesagt - danke!

Und Grüße,
Frank