Selektieren nach Inhalt

Selektieren nach Inhalt

am 10.09.2006 20:12:12 von Sebastian Deiszner

Hallo,

ich habe eine Tabelle mit Datensätzen hier - content - genannt vom Typ - text -.

SELECT id, content FROM presse WHERE ABCDE

Hier ist das Problem, denn ich möchte nur die Datensätze ausgegeben haben, welche das Wort "Müller" oder das Wort "Meier"
enthalten - aber nicht das Wort "Müllermilch" - also nur die Suche nach "ganzen Wörtern".

Wie formuliere ich die Anfrage?

gruß

Sebastian

Re: Selektieren nach Inhalt

am 10.09.2006 20:22:34 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: Selektieren nach Inhalt

am 10.09.2006 22:11:49 von ascii158

Andreas Kretschmer schrieb:
> begin Sebastian Deiszner wrote:
>> Hier ist das Problem, denn ich möchte nur die Datensätze ausgegeben haben, welche das Wort "Müller" oder das Wort "Meier"
>> enthalten - aber nicht das Wort "Müllermilch" - also nur die Suche nach "ganzen Wörtern".
>[...]
>> Wie formuliere ich die Anfrage?
>
> test=# select * from foo;
> id | content
> ----+-------------
> 1 | Müller
> 2 | Meier
> 3 | Müllermilch
> (3 rows)
>
> test=# select * from foo where content in ('Müller', 'Meier');
> id | content
> ----+---------
> 1 | Müller
> 2 | Meier
> (2 rows)
>
>
> Hint: ja, das ist in PostgreSQL gemacht, dürfte aber trivial auch auf
> MySQL anpassbar sein.

Nein, ist es nicht. Denn die genannten Statements funktionieren so auch
in MySQL.

Grüße,
--
Philipp Tölke
PGP: 0x96A1FE7A

Re: Selektieren nach Inhalt

am 10.09.2006 22:29:55 von Claus Reibenstein

Andreas Kretschmer schrieb:

> begin Sebastian Deiszner wrote:

Sagte ich schon, dass dieser Witz uralt ist?

>> SELECT id, content FROM presse WHERE ABCDE
>
> syntax error.

Severe brain malfunction.

"Lesen" und "Verstehen" sind eben zwei verschiedene Dinge.

>> Hier ist das Problem, denn ich möchte nur die Datensätze ausgegeben haben, welche das Wort "Müller" oder das Wort "Meier"
>> enthalten - aber nicht das Wort "Müllermilch" - also nur die Suche nach "ganzen Wörtern".
>
> 'Müllermilch' ist ein ganzes Wort.

"Lesen" und "Verstehen" ...

>> Wie formuliere ich die Anfrage?
>
> test=# select * from foo where content in ('Müller', 'Meier');

Wird Sätze wie "Herr Müller geht aus" oder "Frau Meier geht mit" nicht
finden.

> Hint: ja, das ist in PostgreSQL gemacht

Interessiert hier keine Sau.

Gruß. Claus

Re: Selektieren nach Inhalt

am 11.09.2006 07:04:11 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Selektieren nach Inhalt

am 11.09.2006 08:18:21 von Claus Reibenstein

Andreas Kretschmer schrieb:

> begin Claus Reibenstein schrieb:
>
>> Sagte ich schon, dass dieser Witz uralt ist?
>
> Die Newsgroup über Witze findest Du nebenan.

Das schreibt der Richtige ...

>> Interessiert hier keine Sau.
>
> Eben. Du hast exakt nichts zur Frage geschrieben.

Aber Du, ja? Du hast eine "Lösung" gebracht, die das Problem nicht
einmal ansatzweise löst. Du hast offensichtlich nicht einmal das Problem
verstanden, fühltest Dich aber trotzdem berufen, Deinen Senf dazu zu
geben. Und Du hast noch dazu immer noch nicht begriffen, dass dies hier
eine MySQL- und keine PostgreSQL-Gruppe ist.

> Mach bitte beim rausgehen die Tür leise zu, Danke.

Wann endlich machst _Du_ die Tür zu, und zwar von außen? Darfst sie
ruhig laut zumachen, damit wir es alle mitbekommen.

Gruß. Claus

Re: Selektieren nach Inhalt

am 11.09.2006 08:50:01 von Christian Kirsch

Claus Reibenstein schrieb:

> Wann endlich machst _Du_ die Tür zu, und zwar von außen? Darfst sie
> ruhig laut zumachen, damit wir es alle mitbekommen.
>
Ist das jetzt ein Pluralis majestatis, beherbergst Du mehrere
Persönlichkeiten, oder glaubst Du wirklich, noch für jemanden anders
außer Dir selbst sprechen zu können?

Re: Selektieren nach Inhalt

am 11.09.2006 09:09:10 von Sebastian Deiszner

"Philipp Tölke" schrieb im Newsbeitrag news:ee1ri3$1r1$1@online.de...
>> test=# select * from foo where content in ('Müller', 'Meier');
>> id | content
>> ----+---------
>> 1 | Müller
>> 2 | Meier
>> (2 rows)
>>
>>
>> Hint: ja, das ist in PostgreSQL gemacht, dürfte aber trivial auch auf
>> MySQL anpassbar sein.
>
> Nein, ist es nicht. Denn die genannten Statements funktionieren so auch
> in MySQL.


select * from presse_cdulsa where content in ('Müller');

MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen). (die Abfrage dauerte 0.0006 sek)

Der Begriff ist aber in mehreren Datensätzen enthalten.

Re: Selektieren nach Inhalt

am 11.09.2006 09:21:11 von Thomas Rachel

Sebastian Deiszner wrote:


> Hier ist das Problem, denn ich möchte nur die Datensätze ausgegeben
> haben, welche das Wort "Müller" oder das Wort "Meier" enthalten - aber
> nicht das Wort "Müllermilch" - also nur die Suche nach "ganzen
> Wörtern".

Dann mußt Du die Abfrage so formulieren: "Stell Dir vor, das DB-Feld hat
Wortgrenzen drumrum. Enthält es dann den Begriff "Müller", wenn der auch
Wortgrenzen drumrum hat?


> Wie formuliere ich die Anfrage?


.... WHERE concat(' ',content,' ') LIKE '% Müller %'

Wesentlich besser sollte es allerdings mit FULLTEXT-Indizes
funktionieren, da weiß das Handbuch aber mehr darüber als ich :-}


Thomas
--
Windows? Ich sage nur: »ILOVEYOU«

Re: Selektieren nach Inhalt

am 11.09.2006 09:31:52 von Claus Reibenstein

Christian Kirsch schrieb:

> Claus Reibenstein schrieb:
>
>> Wann endlich machst _Du_ die Tür zu, und zwar von außen? Darfst sie
>> ruhig laut zumachen, damit wir es alle mitbekommen.
>
> Ist das jetzt ein Pluralis majestatis, beherbergst Du mehrere
> Persönlichkeiten, oder glaubst Du wirklich, noch für jemanden anders
> außer Dir selbst sprechen zu können?

Ja, ich glaube das wirklich. Ich glaube in der Tat, nicht der einzige zu
sein, dem Andreas' arrogante Art sauer aufstößt.

Gruß. Claus

Re: Selektieren nach Inhalt

am 11.09.2006 10:08:09 von Claus Reibenstein

Sebastian Deiszner schrieb:

> select * from presse_cdulsa where content in ('Müller');
>
> MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen). (die Abfrage dauerte 0.0006 sek)
>
> Der Begriff ist aber in mehreren Datensätzen enthalten.

So viel zu Andreas' "Lösung" ...

Das Problem ist, dass Du nach ganzen Worten suchen möchtest. Das heisst,
Dein Suchbegriff ist irgendwie abgetrennt vom Rest des Datensatzes.

Hier beginnt schon das erste Problem: Wie sieht das Trennzeichen aus?
Ist es immer ein Leerzeichen, oder können es auch Komma, Semikolon,
Klammern etc. sein? Kann der Begriff am Anfang, am Ende oder irgendwo in
der Mitte stehen? Kann er auch ganz allein vorkommen?

Nehmen wir mal an, alle vier Fälle (Begriff am Anfang, am Ende,
mittendrin, solo) wären möglich, und beschränken wir uns auf Leerzeichen
als Trennzeichen. Dann sollte diese Abfrage das Gewünschte liefern:

select * from presse_cdulsa
where content = "Müller"
or content like "Müller %"
or content like "% Müller"
or content like "% Müller %"

Allerdings sind solche Volltextsuchen nicht gerade besonders performant,
da die komplette Tabelle durchsucht werden muss. Meines Wissens bietet
MySQL zwar so etwas wie einen Volltextindex an, aber Genaueres kann ich
dazu nicht sagen, da ich mich damit noch nicht beschäftigt habe.

Wenn Du auch andere Trennzeichen zulassen möchtest, wird es etwas
komplizierter. Hierzu solltest Du Dir vielleicht mal das Kapitel zu
regulären Ausdrücken reinziehen (REGEXP heißt das Zauberwort).

Gruß. Claus

Re: Selektieren nach Inhalt

am 11.09.2006 13:44:33 von Sibylle Koczian

Claus Reibenstein schrieb:
>=20
> Ja, ich glaube das wirklich. Ich glaube in der Tat, nicht der einzige z=
u
> sein, dem Andreas' arrogante Art sauer aufstößt.
>=20

Das mag sein, da an dieser Newsgroup aber mehr als drei Personen
teilnehmen, ist "wir alle" trotzdem falsch.

--=20
Dr. Sibylle Koczian
Universitaetsbibliothek, Abt. Naturwiss.
D-86135 Augsburg
e-mail : Sibylle.Koczian@Bibliothek.Uni-Augsburg.DE

Re: Selektieren nach Inhalt

am 11.09.2006 13:57:06 von Christian Kirsch

Sebastian Deiszner schrieb:
> "Philipp Tölke" schrieb im Newsbeitrag news:ee1ri3$1r1$1@online.de...
>>> test=# select * from foo where content in ('Müller', 'Meier');
>>> id | content
>>> ----+---------
>>> 1 | Müller
>>> 2 | Meier
>>> (2 rows)
>>>
>>>
>>> Hint: ja, das ist in PostgreSQL gemacht, dürfte aber trivial auch auf
>>> MySQL anpassbar sein.
>> Nein, ist es nicht. Denn die genannten Statements funktionieren so auch
>> in MySQL.
>
>
> select * from presse_cdulsa where content in ('Müller');
>
> MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen). (die Abfrage dauerte 0.0006 sek)
>
> Der Begriff ist aber in mehreren Datensätzen enthalten.
>

Mag sein. Aber offenbar gibt es keine Datensätze, die *nur* das Wort
"Müller" im Feld content enthalten. M.E. bist Du mit einem
Volltextindex und der damit verwendbaren Suche (MATCH ...) am besten
bedient.

Re: Selektieren nach Inhalt

am 11.09.2006 18:48:14 von Sebastian Deiszner

"Sebastian Deiszner" schrieb im Newsbeitrag news:45045577$0$5148$9b4e6d93@newsspool1.arcor-online.net...
> Hallo,
>
> ich habe eine Tabelle mit Datensätzen hier - content - genannt vom Typ - text -.
>
> SELECT id, content FROM presse WHERE ABCDE
>
> Hier ist das Problem, denn ich möchte nur die Datensätze ausgegeben haben, welche das Wort "Müller" oder das Wort "Meier"
> enthalten - aber nicht das Wort "Müllermilch" - also nur die Suche nach "ganzen Wörtern".
>
> Wie formuliere ich die Anfrage?
>

Die Lösung lautet:

SELECT * FROM presse WHERE content LIKE "%Müller%"

Re: Selektieren nach Inhalt

am 11.09.2006 18:59:55 von ascii158

Sebastian Deiszner schrieb:
> "Sebastian Deiszner" schrieb:
>> Hier ist das Problem, denn ich möchte nur die Datensätze ausgegeben
>> haben, welche das Wort "Müller" oder das Wort "Meier" enthalten -
>> aber nicht das Wort "Müllermilch" - also nur die Suche nach "ganzen
>> Wörtern".
>
> Die Lösung lautet:
>
> SELECT * FROM presse WHERE content LIKE "%Müller%"

Nein, das findet auch "Müllermilch". Also es mag eine Lösung für dein
Problem sein, eine Antwort auf deine Frage ist es nicht. ;-)

Grüße,
--
Philipp Tölke
PGP: 0x96A1FE7A

Re: Selektieren nach Inhalt

am 11.09.2006 19:14:42 von Sebastian Deiszner

"Philipp Tölke" schrieb im Newsbeitrag news:ee44ma$kru$1@online.de...
> Sebastian Deiszner schrieb:
>> "Sebastian Deiszner" schrieb:
>>> Hier ist das Problem, denn ich möchte nur die Datensätze ausgegeben
>>> haben, welche das Wort "Müller" oder das Wort "Meier" enthalten -
>>> aber nicht das Wort "Müllermilch" - also nur die Suche nach "ganzen
>>> Wörtern".
>>
>> Die Lösung lautet:
>>
>> SELECT * FROM presse WHERE content LIKE "%Müller%"
>
> Nein, das findet auch "Müllermilch". Also es mag eine Lösung für dein
> Problem sein, eine Antwort auf deine Frage ist es nicht. ;-)
>

Was mache ich, wenn ich Müller - aber nicht Müllermilch finden will?

Re: Selektieren nach Inhalt

am 11.09.2006 19:24:11 von Sven Paulus

Philipp Tölke wrote:
>> SELECT * FROM presse WHERE content LIKE "%Müller%"=20
> Nein, das findet auch "Müllermilch". Also es mag eine Lösung f=
ür dein
> Problem sein, eine Antwort auf deine Frage ist es nicht. ;-)

Dann eben dies:

test> select * from x;
+---------------------------+
| y |
+---------------------------+
| diese eine kleine welt |
| die besten weine der welt |
| unsere kleine farm |
| die welt der elefanten |
+---------------------------+
4 rows in set (0.00 sec)

test> select y from x where y regexp '[[:<:]]eine[[:>:]]';
+------------------------+
| y |
+------------------------+
| diese eine kleine welt |
+------------------------+
1 row in set (0.00 sec)

test> select y from x where y regexp '[[:<:]]welt[[:>:]]';
+---------------------------+
| y |
+---------------------------+
| diese eine kleine welt |
| die besten weine der welt |
| die welt der elefanten |
+---------------------------+
3 rows in set (0.01 sec)

Sehr gute Moeglichkeit, um die Verwendung von Indizes zu verhindern.

Btw: bei derartigen Sachen sollten man mehrstufig vorgehen, erst
einmal sicherstellen, dass alles mit reinem ASCII funktioniert und
dann erst Suchbegriffe mit Umlauten verwenden. Es gibt genug
Moeglichkeiten, wie man Umlaut-Handling verhunzen kann (als Beispiel
dieses Posting eines Nicht-UTF-8-faehigen Newsreaders, auf ein
UTF-8-Posting antwortend), so auch bei MySQL.

Re: Selektieren nach Inhalt

am 11.09.2006 19:45:49 von ascii158

Sebastian Deiszner schrieb:
> Was mache ich, wenn ich Müller - aber nicht Müllermilch finden will?

Siehe und <4mkjruF6h7msU2@individual.net>

Grüße,
--
Philipp Tölke
PGP: 0x96A1FE7A

Re: Selektieren nach Inhalt

am 11.09.2006 19:47:55 von Thomas Rachel

Sebastian Deiszner wrote:

>> Nein, das findet auch "Müllermilch". Also es mag eine Lösung für dein
>> Problem sein, eine Antwort auf deine Frage ist es nicht. ;-)
>>
>
> Was mache ich, wenn ich Müller - aber nicht Müllermilch finden will?

Mein Posting von heute morgen lesen? Oder (vielleicht sogar besser): das
Parallelposting zu Deinem (das zugegebenermaßen 0 Minuten nach Deinem
erschien).


Thomas
--
> Wieso soll die Katze verhungern? Die kann doch zum fressen / jagen immer
> mal wieder aus der Kiste heraustunneln
Womit Schrödingers Katze einen dreifachen Zustand hat: Tot/lebendig/
gerade-mal-rausgetunnelt. (Thomas Ohmeyer und Volker Gringmuth in hd.talk)