like

like

am 03.03.2006 11:59:52 von Mathias Fiedler

Hallo Leute,

folgende Situation:
in meiner DB (mysql) habe ich eine Tabelle Ort. In der Tabelle Ort sind
verscheidene Orte (war ja klar). Jede zeile hat auch ein Spalte plz für die
Postleitzahl. In manchen plz-Feldern stehen nun mehrere plz, also z.B.
02453,02486,02684.
Um einen teffer bei eienr Abfrage zu erhalten benutzer ich like.

der releante Teil des Abfragestrings sieht nun so aus:

$mysql = $mysql."ort.plz like \"%$tabelle_verwendet.plz%\" AND ";

Das ergibt dann im mysql:
ort.plz like "%1006_114.plz%"

Und damit sucht jetzt mysql nach dem string 1006_114.plz.

Ich möchte aber, das nach dem Feld plz aus der Tabelle 1006_114 gesucht
wird.

Wenn ich nämlich eingebe: ort.plz like "%04752%" , dann funktioniert meine
Abfrage.
Wie muß ich denn nun die Abfrage schreiben, damit wirklich nach dem Wert
aus 1006_114.plz und nicht nach dem String 1006_114.plz gefragt wird?

So sieht der gesamte String aus:

SELECT 1006_114.firma, 1006_114.anrede, 1006_114.name, 1006_114.vorname,
1006_114.strasse, 1006_114.plz, ort.ort, 1006_114.tel1, 1006_114.www,
1006_114.mail, 1006_114.logo, 1006_114.keywords, 1006_114.standard1,
1006_114.standard2, 1006_114.standard3, 1006_114.standard4, 1006_114.tag,
1006_114.monat, 1006_114.jahr, 1006_114.aktuell, 1006_114.vert_nummer,
1006_114.ranking, landkreis.landkreis, bundesland.bundesland,
branche.branche, 1006_114.tel2, 1006_114.fax1, 1006_114.fax2,
1006_114.funk1, 1006_114.funk2
FROM 1006_114, ort, landkreis, bundesland, branche
WHERE ort.ort_ID = 1006_114.ort
AND ort.plz LIKE "%1006_114.plz%" <<< und hier hängt es
AND ort.landkreis_ID = landkreis.landkreis_ID
AND ort.bund_ID = bundesland.bund_ID
AND branche.branchen_ID =114
AND bundesland.bundesland = "Sachsen"
AND landkreis.landkreis = "Leipzig"
ORDER BY 1006_114.standard4, 1006_114.standard3, 1006_114.standard2,
1006_114.standard1, 1006_114.ranking, 1006_114.firma

mfg

Mathias

Re: like

am 03.03.2006 13:26:42 von Bodo Kaelberer

Hi Mathias

Mathias Fiedler am Fri, 3 Mar 2006 11:59:52 +0100:

> WHERE ort.ort_ID = 1006_114.ort
> AND ort.plz LIKE "%1006_114.plz%" <<< und hier hängt es

Das ist schon klar. So wie es da notiert ist, ist es ein Wert und
keine Spalte. Ich weiss aber auch nicht, ob es anders möglich ist. Ich
helfe nur, weil sich sonst keiner meldet (-;

Von der Idee her brauchst Du etwas wie:

...AND ort.plz LIKE "%" + 1006_114.plz + "%"...

oder vielleicht auch mit Punkten zum Verknüpfen?

...AND ort.plz LIKE "%" . 1006_114.plz . "%"...

Vielleicht geht aber auch gar nichts davon (-;

Vielleicht hat MySQL auch eine FUnktion zum im Statement selbst eine
Zeichenkette mit einem Spaltenwert auszubauen. Etwas wie:

...AND ort.plz LIKE macheString( "%" + 1006_114.plz + "%" )...

Schau mal ins Handbuch.

Hilft Dir das nicht weiter, dann versuche es in einer Gruppe/Forum
speziell zu MySQL.

--

Re: like

am 03.03.2006 13:38:07 von Frank Schenk

Mathias Fiedler wrote:
> Hallo Leute,
>
> folgende Situation:
> in meiner DB (mysql) habe ich eine Tabelle Ort. In der Tabelle Ort sind
> verscheidene Orte (war ja klar). Jede zeile hat auch ein Spalte plz für die
> Postleitzahl. In manchen plz-Feldern stehen nun mehrere plz, also z.B.
> 02453,02486,02684.
> Um einen teffer bei eienr Abfrage zu erhalten benutzer ich like.
>
> der releante Teil des Abfragestrings sieht nun so aus:
>
> $mysql = $mysql."ort.plz like \"%$tabelle_verwendet.plz%\" AND ";

Nach Bodos Antwort hab ich nun verstanden, worum es geht. Such dir in
der MySQL Doku mal nach find_in_set(), das dürfte genau das sein, was du
brauchst.


gruß, Frank

Re: like

am 03.03.2006 15:04:27 von Mathias Fiedler

Am Fri, 03 Mar 2006 13:26:42 +0100 schrieb Bodo Kaelberer:

> Hi Mathias
>
> Mathias Fiedler am Fri, 3 Mar 2006 11:59:52 +0100:
>
>> WHERE ort.ort_ID = 1006_114.ort
>> AND ort.plz LIKE "%1006_114.plz%" <<< und hier hängt es
>
> Das ist schon klar. So wie es da notiert ist, ist es ein Wert und
> keine Spalte. Ich weiss aber auch nicht, ob es anders möglich ist. Ich
> helfe nur, weil sich sonst keiner meldet (-;
>
> Von der Idee her brauchst Du etwas wie:
>
> ...AND ort.plz LIKE "%" + 1006_114.plz + "%"...
>
> oder vielleicht auch mit Punkten zum Verknüpfen?
>
> ...AND ort.plz LIKE "%" . 1006_114.plz . "%"...
>
> Vielleicht geht aber auch gar nichts davon (-;
>
> Vielleicht hat MySQL auch eine FUnktion zum im Statement selbst eine
> Zeichenkette mit einem Spaltenwert auszubauen. Etwas wie:
>
> ...AND ort.plz LIKE macheString( "%" + 1006_114.plz + "%" )...
>
> Schau mal ins Handbuch.
>
> Hilft Dir das nicht weiter, dann versuche es in einer Gruppe/Forum
> speziell zu MySQL.
>
> --

Hilft leider nicht
mein 1006_114.plz kommt ja von

$mysql_string_suche = $mysql_string_suche."ort.plz like
\"%$tabelle_verwendet.plz%\" AND ";

das steht ja alles in Variablen.

Ich bekomme immer nur den String so hin, das mysql wirklich nach dem String
1006_114.plz sucht aber nicht nach dem Wert in dem Feld 1006_114.plz.

Was für ein Graus.

Um das nochmal zu verdeutlichen:

Meine im php Script generierte mysql Abfrage sieht so aus:

SELECT 1006_114.firma, 1006_114.anrede, 1006_114.name, 1006_114.vorname,
1006_114.strasse, 1006_114.plz, ort.ort, 1006_114.tel1, 1006_114.www,
1006_114.mail, 1006_114.logo, 1006_114.keywords, 1006_114.standard1,
1006_114.standard2, 1006_114.standard3, 1006_114.standard4, 1006_114.tag,
1006_114.monat, 1006_114.jahr, 1006_114.aktuell, 1006_114.vert_nummer,
1006_114.ranking, landkreis.landkreis, bundesland.bundesland,
branche.branche, 1006_114.tel2, 1006_114.fax1, 1006_114.fax2,
1006_114.funk1, 1006_114.funk2
FROM 1006_114, ort, landkreis, bundesland, branche
WHERE ort.ort_ID = 1006_114.ort
AND ort.plz LIKE "%1006_114.plz%" <<< Fehler
AND ort.landkreis_ID = landkreis.landkreis_ID
AND ort.bund_ID = bundesland.bund_ID
AND branche.branchen_ID =114
AND bundesland.bundesland = "Sachsen"
AND landkreis.landkreis = "Leipzig"
ORDER BY 1006_114.standard4, 1006_114.standard3, 1006_114.standard2,
1006_114.standard1, 1006_114.ranking, 1006_114.firma

In der Zeile Fehler sollte eigentlich stehen:
AND ort.plz LIKE "%04572%"
denn das ist genau der Wert, der in 1006_114.plz steht.

So geht aber meine Suche nach dem String 1006_114.plz, und der ist
natürlich in ort.plz nicht enthalten.

Mein Script zur generierung dieser Abfrage sieht im relevanten Teil so aus:

if($plz_in_ort != "no" && $kein_ort == 0)
{
$mysql_string_suche = $mysql_string_suche."ort.plz like
\"%$plz_in_ort%\" AND $tabelle_verwendet.plz = $plz_in_ort AND ";
}else
{
$mysql_string_suche = $mysql_string_suche."ort.plz like
\"%$tabelle_verwendet.plz%\" AND ";
}

Im else Teil ist dann der Fehler.
Wie bekomme ich nun mysql dazu in der LIKE Klausel den Wert aus
$tabelle_verwendet.plz zu verwenden an Stelle den Variablennamen als
Suchstring zu benutzen?

mfg

Mathias

Re: like

am 03.03.2006 15:07:19 von Mathias Fiedler

Am Fri, 03 Mar 2006 13:38:07 +0100 schrieb Frank Schenk:

> Mathias Fiedler wrote:
>> Hallo Leute,
>>
>> folgende Situation:
>> in meiner DB (mysql) habe ich eine Tabelle Ort. In der Tabelle Ort sind
>> verscheidene Orte (war ja klar). Jede zeile hat auch ein Spalte plz für die
>> Postleitzahl. In manchen plz-Feldern stehen nun mehrere plz, also z.B.
>> 02453,02486,02684.
>> Um einen teffer bei eienr Abfrage zu erhalten benutzer ich like.
>>
>> der releante Teil des Abfragestrings sieht nun so aus:
>>
>> $mysql = $mysql."ort.plz like \"%$tabelle_verwendet.plz%\" AND ";
>
> Nach Bodos Antwort hab ich nun verstanden, worum es geht. Such dir in
> der MySQL Doku mal nach find_in_set(), das dürfte genau das sein, was du
> brauchst.
>
>
> gruß, Frank

Das ist es leider auch nicht, da müßte ich die Spalte vorher als SET
definieren. Das löst aber nicht das Problem bei der Abfrage. Es ist einfach
so, das mysql den Variablennamen als String zur Suche verwendet und nicht
den Wert den die Variable enthalten sollte. Das ist der gante Haken.

Ich will einfach den Wert aus Spalte x aus der Tabelle 1 per Like mit den
Werten in Spalte y aus der Tabelle 2 vergleichen.

Mathias

Re: like

am 03.03.2006 15:19:15 von Niels Braczek

Mathias Fiedler schrieb:

> der releante Teil des Abfragestrings sieht nun so aus:
>
> $mysql = $mysql."ort.plz like \"%$tabelle_verwendet.plz%\" AND ";
>
> Das ergibt dann im mysql:
> ort.plz like "%1006_114.plz%"
>
> Und damit sucht jetzt mysql nach dem string 1006_114.plz.
>
> Ich möchte aber, das nach dem Feld plz aus der Tabelle 1006_114 gesucht
> wird.

Ungetestet:

$mysql.= "ort.plz LIKE CONCAT('%', {$tabelle_verwendet}.plz, '%') AND ";

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
------------------------------------------------------------ ----

Re: like

am 03.03.2006 15:29:00 von Bodo Kaelberer

Hi

Mathias Fiedler am Fri, 3 Mar 2006 15:07:19 +0100:

> Das ist es leider auch nicht, da müßte ich die Spalte vorher als SET
> definieren. Das löst aber nicht das Problem bei der Abfrage. Es ist einfach
> so, das mysql den Variablennamen als String zur Suche verwendet und nicht
> den Wert den die Variable enthalten sollte. Das ist der gante Haken.

Das stimmt so nicht. Formulierungen wie

....WHERE table1.feldA = table2.feldB....

sind alltäglich und funktionieren. Du musst das nur irgendwie so
verpacken, dass table2.feldB mit den % verbunden wird und trotzdem
eine Spalte bleibt und nicht zum String-Wert wird.

--

Re: like

am 03.03.2006 15:46:27 von Mathias Fiedler

Am Fri, 03 Mar 2006 15:29:00 +0100 schrieb Bodo Kaelberer:

> Hi
>
> Mathias Fiedler am Fri, 3 Mar 2006 15:07:19 +0100:
>
>> Das ist es leider auch nicht, da müßte ich die Spalte vorher als SET
>> definieren. Das löst aber nicht das Problem bei der Abfrage. Es ist einfach
>> so, das mysql den Variablennamen als String zur Suche verwendet und nicht
>> den Wert den die Variable enthalten sollte. Das ist der gante Haken.
>
> Das stimmt so nicht. Formulierungen wie
>
> ...WHERE table1.feldA = table2.feldB....
>
> sind alltäglich und funktionieren. Du musst das nur irgendwie so
> verpacken, dass table2.feldB mit den % verbunden wird und trotzdem
> eine Spalte bleibt und nicht zum String-Wert wird.
>
> --

Da hast Du natürlich recht, nur wie?

Mathias

Re: like

am 03.03.2006 15:49:52 von Mathias Fiedler

Am Fri, 03 Mar 2006 15:19:15 +0100 schrieb Niels Braczek:

> LIKE CONCAT('%', {$tabelle_verwendet}.plz, '%')

Genau, das wars.
Mit Concat hatte ich auch schon getestet, aber wohl die falsche Syntax
gehabt.

Danke nochmal. War wirklich eine große Hilfe.

Mathias

Re: like

am 03.03.2006 17:39:15 von Hartmut Holzgraefe

Mathias Fiedler wrote:
> Am Fri, 03 Mar 2006 13:38:07 +0100 schrieb Frank Schenk:
>> Nach Bodos Antwort hab ich nun verstanden, worum es geht. Such dir in =

>> der MySQL Doku mal nach find_in_set(), das dürfte genau das sein, wa=
s du=20
>> brauchst.

> Das ist es leider auch nicht, da müßte ich die Spalte vorher als SE=
T
> definieren.

Du hast irgendwie den "Such in der Doku" Schritt übersprungen :(

Das ist eine String-Funktion, Du mußt Dein Schema nicht ändern.

Diese Funktion wurde genau für solche nicht normalisierten Designs
wie Deins geschaffen (hat aber, wie bereits in d.c.d.mysql erwähnt,
keine Möglichkeit Indices zu benutzen, ein Überdenken des Designs
ist also nach wie vor angeraten).

Da unsere Online Dokumentation irgendwie grad nicht erreichbar
ist zitiere ich einmal aus "String Functions"

FIND_IN_SET(str,strlist)

Returns a value 1 to N if the string str is in the string list strlis=
t
consisting of N substrings. A string list is a string composed of
substrings separated by =91,=92 characters. If the first argument is =
a
constant string and the second is a column of type SET, the FIND_IN_S=
ET()
function is optimized to use bit arithmetic. Returns 0 if str is not =
in
strlist or if strlist is the empty string. Returns NULL if either arg=
ument
is NULL. This function does not work properly if the first argument
contains a comma (=91,=92) character.

mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2



--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

http://www.mysql.com/support/

Re: like

am 03.03.2006 18:53:57 von Frank Schenk

Hartmut Holzgraefe wrote:
> Mathias Fiedler wrote:

>> Das ist es leider auch nicht, da müßte ich die Spalte vorher als SET
>> definieren.
>
> Du hast irgendwie den "Such in der Doku" Schritt übersprungen :(
>
> Das ist eine String-Funktion, Du mußt Dein Schema nicht ändern.
>
> Diese Funktion wurde genau für solche nicht normalisierten Designs
> wie Deins geschaffen (hat aber, wie bereits in d.c.d.mysql erwähnt,
> keine Möglichkeit Indices zu benutzen, ein Überdenken des Designs
> ist also nach wie vor angeraten).
>
> Da unsere Online Dokumentation irgendwie grad nicht erreichbar
> ist zitiere ich einmal aus "String Functions"

Ein Fleißkärtchen für deu Doku-Vorlesedienst :)


Schöne Grüße aus dem verschneiten Frankfurt,

Frank