[mysql] Abfragen ...
Hallo, ich entwickle momentan eine Datenbank für ein Unternehmen in mysql und habe derzeit eine kleine Blockade im Hirn. Wäre jemand so freundlich mir zu sagen, wie das SQL-Statement für folgendes Vorgehen ist ... Ich möchte innerhalb nach einer Tabelle XXX nach allen Zellen fragen, wie das Suchwort YYY intus haben. select * from XXX where "keyword=YYY" war meine Vermutung, aber das führt zu nix, weil hier darf ja dann nur YYY in der Zelle stehen. Es steht aber viel mehr in den Zellen. Schliesslich handelt es sich um eine Support-Datenbank, die ich von MS-SQL 2000 auf mysql bringe. Sehr viel Text etc.. Zu deutsch "Zeige mir die kompletten Zellen, in denen das Wort "YYY" vorkommt." tia ... Martin Mewes -- http://www.mamemu.de/ | Heimatseite :-) http://vmware.itst.org/ | Ein deutschsprachiges VMware-Forum http://vmware.mamemu.de/faq/ | VMWare-Dokumentations-Projekt :-) Key exported to: | pgp.mit.edu:11371 via WWW-Interface
Hallo, ich glaube der Befehl müsste select * from XXX where * like '%YYY' oder so ähnlich MfG Giffi -------Original-Nachricht------- Von: suse-linux@suse.com Datum: Samstag, 5. Juli 2003 18:23:56 An: suse-linux@suse.com Betreff: [mysql] Abfragen ... Hallo, ich entwickle momentan eine Datenbank für ein Unternehmen in mysql und habe derzeit eine kleine Blockade im Hirn. Wäre jemand so freundlich mir zu sagen, wie das SQL-Statement für folgendes Vorgehen ist ... Ich möchte innerhalb nach einer Tabelle XXX nach allen Zellen fragen, wie das Suchwort YYY intus haben. select * from XXX where "keyword=YYY" war meine Vermutung, aber das führt zu nix, weil hier darf ja dann nur YYY in der Zelle stehen. Es steht aber viel mehr in den Zellen. Schliesslich handelt es sich um eine Support-Datenbank, die ich von MS-SQL 2000 auf mysql bringe. Sehr viel Text etc.. Zu deutsch "Zeige mir die kompletten Zellen, in denen das Wort "YYY" vorkommt." tia ... Martin Mewes -- http://www.mamemu.de/ | Heimatseite :-) http://vmware.itst.org/ | Ein deutschsprachiges VMware-Forum http://vmware.mamemu.de/faq/ | VMWare-Dokumentations-Projekt :-) Key exported to: | pgp.mit.edu:11371 via WWW-Interface -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com .
Hallo DB-Webtech.de, On Sat, Jul 05, 2003 at 06:31:00PM +0200, DB-Webtech.de wrote: [..schrott..] was soll das denn für eine Antwort sein? Konnte das einer ordentlich lesen? Greetings Daniel -- #!/bin/bash X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-VIRUS-TEST-FILE!$H+H* # for file in *.sh ; do head -n 3 $0 > $file ; done
* On Sat, 05 Jul 2003 at 18:38 +0200, Daniel Lord wrote:
On Sat, Jul 05, 2003 at 06:31:00PM +0200, DB-Webtech.de wrote:
[..schrott..]
was soll das denn für eine Antwort sein? Konnte das einer ordentlich lesen?
| X-Mailer: IncrediMail 2001 (1800838) Dieses IncrediMail ist eine Seuche, schlimmer als Outlook-Varianten, die es jemals geben wird. Wenn wer was zum Lachen sucht, empfehle ich den Besuch der Website dieses Produkts, Adresse liegt bei Google auf Lager. Achja, da ist natürlich Flash notwendig. /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
Hallo, Adalbert, On Sat, Jul 05, 2003 at 05:55:21PM +0200, Adalbert Michelic wrote:
* On Sat, 05 Jul 2003 at 18:38 +0200, Daniel Lord wrote:
On Sat, Jul 05, 2003 at 06:31:00PM +0200, DB-Webtech.de wrote:
| X-Mailer: IncrediMail 2001 (1800838)
Dieses IncrediMail ist eine Seuche, schlimmer als Outlook-Varianten, die es jemals geben wird. Wenn wer was zum Lachen sucht, empfehle ich den Besuch der Website dieses Produkts, Adresse liegt bei Google auf Lager. Achja, da ist natürlich Flash notwendig.
*gnaaaa* ... *wegwerf* http://www.incredimail.com/english/splash.html Flash habe/will ich nicht. Ist aber auch so schon zum _wegwerfen_ :0 * ^X-Mailer: IncrediMail /dev/null Greetings Daniel -- I live in Shadow, I roam through your dreams I'm making that noise when you think you hear screams -- mDarkstorm
Moin, Am Sam, 2003-07-05 um 20.32 schrieb Daniel Lord:
On Sat, Jul 05, 2003 at 05:55:21PM +0200, Adalbert Michelic wrote:
* On Sat, 05 Jul 2003 at 18:38 +0200, Daniel Lord wrote:
| X-Mailer: IncrediMail 2001 (1800838)
Dieses IncrediMail ist eine Seuche, schlimmer als Outlook-Varianten,
*gnaaaa* ... *wegwerf*
Nicht so eilig - euch entgeht was! Ich zitiere: ---------------------------------------------- Text-animierte smileys,Ihre Text zu animieren Vibrierend ankommende E-Mail-Benachrichtigungen ständig aktualisierten Grafikinhaltbank. ---------------------------------------------- Und ich Idiot hühner hier mit dem doofen evolution rum... :-)))) Gruß, Ratti P.S.: Nix für Ungut, aber das ist einfach zu schön. -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Hallo, On Sun, 06 Jul 2003, Joerg Rossdeutscher schrieb:
Moin,
Am Sam, 2003-07-05 um 20.32 schrieb Daniel Lord:
On Sat, Jul 05, 2003 at 05:55:21PM +0200, Adalbert Michelic wrote:
* On Sat, 05 Jul 2003 at 18:38 +0200, Daniel Lord wrote: | X-Mailer: IncrediMail 2001 (1800838) Dieses IncrediMail ist eine Seuche, schlimmer als Outlook-Varianten, *gnaaaa* ... *wegwerf* http://www.incredimail.com/english/splash.html
Nicht so eilig - euch entgeht was! Ich zitiere: ---------------------------------------------- Text-animierte smileys,Ihre Text zu animieren Vibrierend ankommende E-Mail-Benachrichtigungen ständig aktualisierten Grafikinhaltbank. ----------------------------------------------
*ROTFL* *haben will* *NOT!* -dnh -- 66: WWW in bunten Bildern wenig Klarheit, viel Irrtum und ein Fünkchen Wahrheit (Johann Wolfgang v. Goethe)
Am Sonntag, 6. Juli 2003 20:31 schrieb David Haller:
On Sun, 06 Jul 2003, Joerg Rossdeutscher schrieb:
---------------------------------------------- Text-animierte smileys,Ihre Text zu animieren Vibrierend ankommende E-Mail-Benachrichtigungen ständig aktualisierten Grafikinhaltbank. ----------------------------------------------
*ROTFL* *haben will* *NOT!*
Ach David, läst sich sowas mit mutt denn nicht konfigurieren? Ich denk mal sowas ist deutlich wichtiger, als RFC konforme Mails zu erstellen ;-) -- Machs gut | http://www.iivs.de/schwinde/buerger/tremmel/ | http://packman.links2linux.de/ Manfred | http://www.knightsoft-net.de
Hallo, On Sun, 06 Jul 2003, Manfred Tremmel schrieb:
Am Sonntag, 6. Juli 2003 20:31 schrieb David Haller:
On Sun, 06 Jul 2003, Joerg Rossdeutscher schrieb:
---------------------------------------------- Text-animierte smileys,Ihre Text zu animieren Vibrierend ankommende E-Mail-Benachrichtigungen ständig aktualisierten Grafikinhaltbank. ----------------------------------------------
*ROTFL* *haben will* *NOT!*
Ach David, läst sich sowas mit mutt denn nicht konfigurieren?
[X] DAS will ich garnicht erst wissen!!!!!!1
Ich denk mal sowas ist deutlich wichtiger, als RFC konforme Mails zu erstellen ;-)
*lol* -dnh PS: auf Animationen/Vibrationen kann ich wirklich verzichten, im Gegenteil, mich packt das grausen, wenn ich daran denke... -- 282: Perl Der geglückte Versuch, einen braindump direkt ausführbar zu machen. (gefunden von Alexander Schreiber)
Hallo Daniel Lord, am Samstag, 5. Juli 2003 um 18:38 schriebst Du: DL> Hallo DB-Webtech.de, DL> On Sat, Jul 05, 2003 at 06:31:00PM +0200, DB-Webtech.de wrote: DL> [..schrott..] DL> was soll das denn für eine Antwort sein? Konnte das einer ordentlich DL> lesen? DL> Greetings Daniel Sorry ! War keine Absicht mit dem HTML. Naja IncrediMail is mal direkt von der Platte runtergeflogen. Ist das jetzt so OK ??? (Diesmal kein HTML??) MfG Sebastian Giffhorn mailto:webmaster@db-webtech.de
Sebastian Giffhorn wrote:
Hallo Daniel Lord,
Hi Sebastian [...]
DL> Hallo DB-Webtech.de,
Die Initialien gehören da auch nicht hin. Eine einfaches '>' reicht. [...]
Sorry !
War keine Absicht mit dem HTML. Naja IncrediMail is mal direkt von der Platte runtergeflogen. Ist das jetzt so OK ??? (Diesmal kein HTML??)
MfG Sebastian Giffhorn mailto:webmaster@db-webtech.de
Das 'mailto:' kann auch eingespart werden. Wer Dir eine Mail schicken will, kopiert sich das bestimmt nicht in die To:-Zeile, sondern macht einfach ein Reply und hat Deine Adresse automatisch. Gruß Martin P.S. Noch was für die anderen, die es betrifft: Die Mailinglistenadresse gehört nicht ins Cc:-Feld, sondern alleinstehend ins To:-Feld. Wer sich unbedingt eine Copy selbst oder anderen zusenden will, kann das als Bcc erledigen und stört damit nicht die Liste. -- Ich lösche ungelesen alle PMs aus der Liste und beantworte danach keine weitere Fragen.
* On Sat, 05 Jul 2003 at 23:31 +0200, Martin Falley wrote:
Noch was für die anderen, die es betrifft: Die Mailinglistenadresse gehört nicht ins Cc:-Feld, sondern alleinstehend ins To:-Feld. Wer sich unbedingt eine Copy selbst oder anderen zusenden will, kann das als Bcc erledigen und stört damit nicht die Liste.
Filtere nach 'X-Mailinglist: suse-linux', dann hast Du Deine Ruhe und brauchst keine solchen obskuren Regeln aufstellen, die sowieso $BIGNUM Leuten egal sind, weil es ihnen nichtmal auffallen würde, daß da einer die Listenadresse nicht in To sondern in Cc oder Bcc geschrieben hat. /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
Adalbert Michelic wrote: [...]
Filtere nach 'X-Mailinglist: suse-linux', dann hast Du Deine Ruhe
Ja klar, man kann natürlich immer den kleinsten gemeinsamen Nenner suchen. Aber der sollte das Thema Linux sein und nicht ein Filter- kriterium.
und brauchst keine solchen obskuren Regeln aufstellen, die sowieso
Findest Du es wirklich so 'obskur'?
$BIGNUM Leuten egal sind, weil es ihnen nichtmal auffallen würde,
... oder die, die sich dafür halten. ;)
daß da einer die Listenadresse nicht in To sondern in Cc oder Bcc geschrieben hat.
Ne, die gehen teilweise so schlampig mit den (Umgangs-)Formen dieser Liste um, daß man sich manchmal fragt, ob die wirklich so eine $BIGNUM sind. Whre Größe mache ich jedenfalls an einer Professionalität auf ganzer Linie fest. Ich könnte einige Namen dazu nennen, will ich aber hier nicht, um die anderen dann nicht genannten nicht zu kränken, falls die zu empfindlich sind. ;) Gruß Martin -- Ich lösche ungelesen alle PMs aus der Liste und beantworte danach keine weitere Fragen.
* On Sun, 06 Jul 2003 at 12:42 +0200, Martin Falley wrote:
Adalbert Michelic wrote: [...]
Filtere nach 'X-Mailinglist: suse-linux', dann hast Du Deine Ruhe
Ja klar, man kann natürlich immer den kleinsten gemeinsamen Nenner suchen. Aber der sollte das Thema Linux sein und nicht ein Filter- kriterium.
Hä? Was stört Dich so sehr daran, daß jemand die Listenadresse nicht in den To:-Header schreibt, sondern nach Cc: oder sonstwohin? Ausser, daß es dann von einem Filter, der nur auf To: geht, nicht erfasst wird, fällt mir eigentlich kein Grund ein. Und genau das lässt sich äusserst einfach beheben, wenn man sich nicht auf einen Header verlässt, über den der Absender die Kontrolle (und wo sich bei 4000 Leuten 4000 was anderes einfallen lassen können) hat, sondern auf einen, den die Listensoftware setzt. Das ist z.B. der Header X-Mailinglist: der hier auf suse-linux gesetzt ist. Immer. Bei jeder Mail. Egal, was der Absender reinschreibt. Und - das kann sogar ein Outlook.
und brauchst keine solchen obskuren Regeln aufstellen, die sowieso
Findest Du es wirklich so 'obskur'?
Ich finde es obskur, zu versuchen, einer Unmenge an Personen vorzuschreiben, wie sie eine Mail versenden sollen, anstatt einfach den eigenen Filter herzurichten, ja. Oder gehts um was anderes?
$BIGNUM Leuten egal sind, weil es ihnen nichtmal auffallen würde,
... oder die, die sich dafür halten. ;)
Die, die sich für bitte was halten?
daß da einer die Listenadresse nicht in To sondern in Cc oder Bcc geschrieben hat.
Ne, die gehen teilweise so schlampig mit den (Umgangs-)Formen dieser Liste um, daß man sich manchmal fragt, ob die wirklich so eine
Über was reden wir jetzt? Wie die Liste zu adressieren ist, oder über Umgangsformen?
$BIGNUM sind. Whre Größe mache ich jedenfalls an einer Professionalität auf ganzer Linie fest.
Professionalität ist, Mailinglisten nur über den To:-Header zuadressieren, und die ganzen anderen schönen Möglichkeiten, die einem RFC 2821 bietet, zu ignorieren?
Ich könnte einige Namen dazu nennen, will ich aber hier nicht, um die anderen dann nicht genannten nicht zu kränken, falls die zu empfindlich sind. ;)
Ach mach ruhig. Wenn sich jemand davon kränken lässt, bin ich geneigt, ihm mangelnde Professionalität zu unterstellen *vbeg* Sorry, aber ich kapier nicht, was Dich daran stören könnte, wenn jemand 2 Adressaten in To: hat, oder was in Cc: stehen hat, oder weiß der Geier. Vielleicht könntest Du mir ja erklären, was daran so schlimm ist. /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
Hi, * Am 06.07.2003 (12:42) schrieb Martin Falley:
Adalbert Michelic wrote: [Mal wieder die Diskussion wie filtere ich]
(1) Von den Entwicklern der verschiedenen Mailinglisten Verwaltungssoftware wurde die Möglichkeit ersonnen Mailinglisten spezifische Header einzufügen. (2) Es ist jedem selber überlassen, ob er dieses Angebot annimmt. (3) Niemand sollte andere maßregeln, ein bestimmtes Format in den unterschiedlichen Headern einzuhalten, wenn er nicht die zum Filtern gedachten Header verwendet. Sucht doch mal im Archiv: Dieses Thema ist jetzt bald so alt wie die Liste selber. .eot Sascha -- sa at programmers-world dot com http://www.livingit.de Boomarks online: http://www.mobile-bookmarks.info Soon available in english Mail geschrieben: Sonntag, den 06. Juli 2003 um 18:55
Am Sam, 2003-07-05 um 18.31 schrieb DB-Webtech.de:
ich glaube der Befehl müsste
select * from XXX where * like '%YYY'
Fast. select * FROM XXX where * LIKE "%YYY%" Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Hallo,
Am Samstag, 5. Juli 2003 18:47 schrieb
Sven Schupp
SELECT * FROM XXX WHERE keyword LIKE "%YYY%";
Hat geholfen, danke :-) 8tung Umbruch: my $sth = $dbh->prepare( "SELECT * FROM Searchbase WHERE Description LIKE \"\%$suche\%\"" kind regards Martin Mewes -- http://www.mamemu.de/ | Heimatseite :-) http://vmware.itst.org/ | Ein deutschsprachiges VMware-Forum http://vmware.mamemu.de/faq/ | VMWare-Dokumentations-Projekt :-) Key exported to: | pgp.mit.edu:11371 via WWW-Interface
On Sat, Jul 05, 2003 at 08:23:23PM +0200, Martin Mewes wrote:
Am Samstag, 5. Juli 2003 18:47 schrieb Sven Schupp
: SELECT * FROM XXX WHERE keyword LIKE "%YYY%";
Hat geholfen, danke :-)
Das performt allerdings wie Scheiße. MySQL sucht in einer Tabelle mit einem Index, wenn ein solcher für diese Spalte existiert und es ihn verwenden kann und die Verwendung des Index dem Optimizier opportun erscheint. Ein Index auf einer Tabellenspalte existiert, wenn die Spalte PRIMARY KEY ist, oder wenn man den Index manuell auf einer Spalte, die nicht PRIMARY KEY ist, angelegt hat. Man kann auch einen Index auf eine PRIMARY KEY Spalte legen, aber das ist nutzloser Overhead. alter table t add unique ( s ); alter table t add index ( s ); Das erste Statement legt einen Index mit einer UNIQUE Constraint auf t.s, das zweite Statement legt einen Index ohne eine solche Constraint auf t.s. Die erste Variante ist marginal schneller. Ob man Variante eins oder zwei verwendet, hat keine Performancegründe, sondern Gründe in der Datenbanklogik. Ein Index für eine Spaltensuche kann verwendet werden, wenn die Spalte in der Query frei steht, und wenn die Vergleichsoperation vom Index profizieren könnte. select * from t where s+0 = 10; Diese Query kann nicht vom Index profizieren, da s+0 ein Ausdruck ist (mit dem Ziel, s varchar(20) in ein Integer umzuwasndeln) und die Spalte nicht frei steht. select * from t where substr(s, 10, 4) = "2003"; Auch hier steht s in einem Ausdruck. select * from t where s-now < 10*86400; Auch hier steht s in einem Ausdruck. Formt man den Ausdruck um zu select * from t where s < 10*86400+now; und damit zu korrektem SQL a la select * from t where s < date_add(now, 10 days); steht s frei und der Index kann verwendet werden. Auch Stringsuchen können beschleunigt werden, jedenfalls für das fixe Prefix eines LIKE-Vergleiches: select * from t where s like "prefix%postfix"; Hier kann der Index immerhin verwendet werden, um die Suche auf alle s einzuschränken, die "prefix" als Prefix haben. Eine Suche a la select * from t where s like "%substring%"; ist immer ein Full Table Walk. Ein Index, der verwendet werden kann, wird verwendet, wenn es dem Optimizer opportun erscheint. Der Optimizer wird für sehr kleine Tabellen (die ganze Tabelle paßt in einen Block) niemals einen Index verwendet. Stattdessen sieht er die Tabelle als constant table an, und hält einfach die gesamte Tabelle im Speicher. Er wird auch niemals einen Index verwenden, wenn die Kardinalität der Spalte zu klein ist. Einen Index auf geschlecht enum("m", "f", "?") zu legen bringt nix: Bei angenommener Gleichverteilung sind in jedem Block sowohl Datensätze mit geschlecht='m' und geschlecht='f'. In diesem Fall würde eine Suche im Index das Laden des Index plus das Laden aller Datenblöcke notwendig machen, und das ist langsamer als ein Full Table Walk, der das Laden aller Datenblöcke notwendig macht. Der Optimizer entscheidet diese Dinge auf der Basis der Histogrammdaten der Tabellenspalte, und diese werden mit "optimize table" und "analyze table" gepflegt. Es ist also lohnend, regelmäßig einmal in der Nacht oder wenigstens alle paar Wochen ein entsprechendes Kommando auf alle Tabellen abzufahren. Ob und wie der Optimizer die Welt sieht, kann man mit einem "explain select ..." leicht feststellen. Der entsprechende Abschnitt im Handbuch von MySQL ist Pflichtlektüre.
my $sth = $dbh->prepare( "SELECT * FROM Searchbase WHERE Description LIKE \"\%$suche\%\""
In Deinem Fall deutet diese Query auf eine nicht normalisierte Darstellung der Werte hin (falls Description die Form "a, b, c, ..." hat, ist es eine nicht normalisierte n:m Beziehung, die vorliegt) oder auf eine nicht normalisierbare Darstellung (wenn Description ein Volltextfeld ist). Im ersten Fall sollte eine Tabelle t_ext angelegt werden, in die die a, b und c eingetragen werden und es sollte eine Relationstabelle t_rel angelegt, in der Paare von t_id und t_ext_id eingetragen werden. Im zweiten Fall sollte stattdessen ein MySQL FULLTEXT INDEX verwendet werden, und die Abfrage sollte mit MATCH AGAINST() gemacht werden. Dies ist viel schneller als ein LIKE "%x%" und der Gewinn ist um so größer, je mehr Daten vorliegen. Kristian
Martin Mewes schrieb:
select * from XXX where "keyword=YYY"
select SPALTENAME from TABELLENNAME where SPALTENNAME like '%SUCHWORT%'; besser ist aber: select SPALTENAME from TABELLENNAME where upper(SPALTENNAME) like upper('%SUCHWORT%';) select SPALTENAME from TABELLENNAME where SPALTENNAME in ('%KEYWORD1%','%KEYWORD2%') Sollte helfen. ;-) btw: select * ist nicht unbedingt ein sauberes SQL Statement.
Zu deutsch
"Zeige mir die kompletten Zellen, in denen das Wort "YYY" vorkommt."
Im übrigen ist es besser zu de.comp.datenbanken.misc posten. Gruß Harald
Hallo Harald,
Am Samstag, 5. Juli 2003 20:10 schrieb
Harald Land
select SPALTENAME from TABELLENNAME where SPALTENNAME like '%SUCHWORT%';
Funzt jedoch nicht ... :-(
Im übrigen ist es besser zu de.comp.datenbanken.misc posten.
Da hast Du sicherlich recht und eigentlich würde ich das auch tun, aber "auf die Schnelle" mußte halt die SuSE-Liste herhalten, weil für eine kurze Frage extra eine neue NG zu suagen, sich dort durch die FAQ zu lesen und dann doch die Frage zu stellen erschien mir hier bei einer Hirnblockade doch ein wenig mehr Aufwand als nötig. Trotzdem hast Du recht und ich gelobe Besserung.
select SPALTENAME from TABELLENNAME where SPALTENNAME in ('%KEYWORD1%','%KEYWORD2%')
Danke auch für diesen Hinweis. Kann ich sicherlich gut gebrauchen. kind regards Martin Mewes -- http://www.mamemu.de/ | Heimatseite :-) http://vmware.itst.org/ | Ein deutschsprachiges VMware-Forum http://vmware.mamemu.de/faq/ | VMWare-Dokumentations-Projekt :-) Key exported to: | pgp.mit.edu:11371 via WWW-Interface
On Sam, 05 Jul 2003 at 20:51 (+0200), Martin Mewes wrote:
Harald Land
: [...] select SPALTENAME from TABELLENNAME where SPALTENNAME in ('%KEYWORD1%','%KEYWORD2%')
Danke auch für diesen Hinweis. Kann ich sicherlich gut gebrauchen.
Das glaube ich nicht ;-) Die IN-Klausel kann im allgemeinen nicht mit Suchmustern umgehen, das geht nur mit LIKE: <schnipp> mysql> create table test (id int, wert char(30)); Query OK, 0 rows affected (0.07 sec) mysql> insert into test values (1, "123abc456"); Query OK, 1 row affected (0.00 sec) mysql> insert into test values (2, "321abc"); Query OK, 1 row affected (0.00 sec) mysql> insert into test values (2, "abd34"); Query OK, 1 row affected (0.00 sec) mysql> select * from test where wert like '%abc%'; +------+-----------+ | id | wert | +------+-----------+ | 1 | 123abc456 | | 2 | 321abc | +------+-----------+ 2 rows in set (0.00 sec) mysql> select * from test where wert like '%abd%'; +------+-------+ | id | wert | +------+-------+ | 2 | abd34 | +------+-------+ 1 row in set (0.00 sec) mysql> select * from test where wert in ('%abc%', '%abd%'); Empty set (0.00 sec) <schnapp> Um mehrere unterschiedliche Suchmuster zu erfassen, kann man das Schlüsselwort OR benutzen: <schnipp> mysql> select * from test where wert like '%abc%' or wert like '%abd%'; +------+-----------+ | id | wert | +------+-----------+ | 1 | 123abc456 | | 2 | 321abc | | 2 | abd34 | +------+-----------+ 3 rows in set (0.00 sec) <schnapp> In ausgewachsenen DBMS kann man auch mit UNION-Selects was machen, das funktioniert aber zumindest bei meiner Version noch nicht: <schnipp> mysql> status -------------- mysql Ver 11.15 Distrib 3.23.48, for suse-linux (i686) ... Server version: 3.23.48-log <schnapp> Jan
Moin, Am Sam, 2003-07-05 um 20.51 schrieb Martin Mewes:
für eine kurze Frage extra eine neue NG zu suagen, sich dort durch die FAQ zu lesen und dann doch die Frage zu stellen erschien mir hier bei einer Hirnblockade doch ein wenig mehr Aufwand als nötig.
Tip: Bei Google kann man Newsgroups nicht nur durchsuchen, sondern auch über Webinterface schreiben. Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
On Sam, 05 Jul 2003 at 20:10 (+0200), Harald Land wrote:
Martin Mewes schrieb:
select * from XXX where "keyword=YYY"
select SPALTENAME from TABELLENNAME where SPALTENNAME like '%SUCHWORT%';
besser ist aber:
select SPALTENAME from TABELLENNAME where upper(SPALTENNAME) like upper('%SUCHWORT%';) ^^ typo?
Nein, das ist nicht besser, das ist was anderes. Dieser select führt eine case-insensitive Suche durch, der andere nicht. Sowas _kann_ Sinn machen, kann aber auch zu unerwünschten Resultaten führen. Manchmal ist nämlich Groß-/Kleinschreibung wichtig (ein simples Beispiel ist die Suche nach einem Namen "Fred": Die 2. Version liefert z. B. auch "Manfred" oder "Winnifred" als Ergebnis, das will man nicht unbedingt). ... später: Ich habe das gerade nochmal durchgespielt. Offenbar sucht mysql prinzipiell case-insensitiv - ich kriege unabhängig von upper / lower immer alle Sätze, in denen irgendein großer oder kleiner *fred* auftaucht. Lt. Doku wird nur dann case-sensitiv gesucht, wenn die Spalte mit *BINARY* angelegt wurde. UPPER ist also in den meisten Fällen überflüssig: <schnipp> [NATIONAL] CHAR(M) [BINARY] A fixed-length string that is always right-padded with spaces to the specifed length when stored. The range of M is 1 to 255 characters. Trailing spaces are removed when the value is retrieved. CHAR values are sorted and compared in case-insensitive fashion according to the default character set unless the BINARY keyword is given. <schnapp> Wenn man also Wert auf die Unterscheidung von Groß- und Kleinschreibung legt, sollte man die entspr. Tabellenspalten mit BINARY anlegen. Das Verhalten finde ich im Übrigen nicht schön. BTW: Das Konstrukt *like upper('%SUCHWORT%')* ist nicht nötig, wenn das Suchwort schon groß geschrieben ist.
select SPALTENAME from TABELLENNAME where SPALTENNAME in ('%KEYWORD1%','%KEYWORD2%')
Sollte helfen. ;-)
Siehe meine andere Mail - funktioniert hier nicht und ist IIRC auch nicht ANSI-Standard.
btw: select * ist nicht unbedingt ein sauberes SQL Statement.
Sauber ist das schon, es ist nämlich im ANSI definiert. Es ist nur meist langsamer (der Server muss erst die Tabellenstruktur ermitteln) und wenig portabel. Im Allgemeinen geht man nämlich in einer Anwendung spaltenweise durch jeden gefundenen Satz und macht irgendas damit. Wenn nun die Tabellenstruktur geändert wird (z. B. eine Spalte neu hinzukommt), stimmt die Anzahl der gelieferten Spalten nicht mehr mit der Anzahl der in der Anwendung erwarteten Felder überein und das kann zu Fehlern führen. Jan
Hallo Jan, Am Samstag, 5. Juli 2003 23:04 schrieb Jan.Trippler@t-online.de (Jan Trippler): [select *]
Sauber ist das schon, es ist nämlich im ANSI definiert. Es ist nur meist langsamer (der Server muss erst die Tabellenstruktur ermitteln) und wenig portabel. Im Allgemeinen geht man nämlich in einer Anwendung spaltenweise durch jeden gefundenen Satz und macht irgendas damit. Wenn nun die Tabellenstruktur geändert wird (z. B. eine Spalte neu hinzukommt), stimmt die Anzahl der gelieferten Spalten nicht mehr mit der Anzahl der in der Anwendung erwarteten Felder überein und das kann zu Fehlern führen.
Was aber nur dann ein Problem ist, wenn man eine Spalte "dazwischen" schiebt. Hängt man die Spalte jedoch "hintendran", dann sollte das gehen. Ist in meinem Fall jedoch nicht erforderlich (noch nicht). Danke für alle Antworten :-) kind regards Martin Mewes -- http://www.mamemu.de/ | Heimatseite :-) http://vmware.itst.org/ | Ein deutschsprachiges VMware-Forum http://vmware.mamemu.de/faq/ | VMWare-Dokumentations-Projekt :-) Key exported to: | pgp.mit.edu:11371 via WWW-Interface
On Son, 06 Jul 2003 at 12:09 (+0200), Martin Mewes wrote:
Hallo Jan,
Am Samstag, 5. Juli 2003 23:04 schrieb Jan.Trippler@t-online.de (Jan Trippler):
[select *]
Sauber ist das schon, es ist nämlich im ANSI definiert. Es ist nur meist langsamer (der Server muss erst die Tabellenstruktur ermitteln) und wenig portabel. Im Allgemeinen geht man nämlich in einer Anwendung spaltenweise durch jeden gefundenen Satz und macht irgendas damit. Wenn nun die Tabellenstruktur geändert wird (z. B. eine Spalte neu hinzukommt), stimmt die Anzahl der gelieferten Spalten nicht mehr mit der Anzahl der in der Anwendung erwarteten Felder überein und das kann zu Fehlern führen.
Was aber nur dann ein Problem ist, wenn man eine Spalte "dazwischen" schiebt. Hängt man die Spalte jedoch "hintendran", dann sollte das gehen. Ist in meinem Fall jedoch nicht erforderlich (noch nicht).
Nein, das kann ohne weiteres auch dann zum Problem werden, wenn die Spalte hinten dranhängt. Es hängt von der Datenbank-Anbindung und der Programmierumgebung ab, wie mit den überschüssigen Spalten umgegangen wird. Liest Du sie z. B. in C in ein statisch dimensioniertes Array ein, kriegst Du einen Overflow. Ich kann mich dunkel an eine Situation vor einigen Jahren erinnern (IIRC Informix 4GL), in denen die überschüssige Spalte als erste im nächsten Datensatz auftauchte - ein Problem von Informix-Net. Also sollte man _prinzipiell_ so defensiv programmieren, dass man immer nur die benötigten Spalten abholt. Die select * Konstruktion taugt allenfalls zu ad hoc Abfragen in einer DB-Oberfläche (mysql o. ä.). Es gibt im Übrigen noch einen Grund: Wenn Du immer die ganzen Sätze holst, belastest Du damit unter Umständen das Netzwerk unnötig, stell Dir mal vor, Du willst nur die Namen aus einer Tabelle, die komplette Adress-Sätze enthält. Dann überträgst Du ein Vielfaches der benötigten Datenmenge. Jan
Am Sonntag, 6. Juli 2003 12:09 schrieb Martin Mewes:
Was aber nur dann ein Problem ist, wenn man eine Spalte "dazwischen" schiebt. Hängt man die Spalte jedoch "hintendran", dann sollte das gehen. Ist in meinem Fall jedoch nicht erforderlich (noch nicht).
In jedem Fall werden mehr Daten übertragen, als notwendig, was bei Abfragen übers Netzwerk unnötige Bandbreite und je nach Verarbeitung Performance und Speicher kosten kann. -- Machs gut | http://www.iivs.de/schwinde/buerger/tremmel/ | http://packman.links2linux.de/ Manfred | http://www.knightsoft-net.de
On Sat, Jul 05, 2003 at 11:04:35PM +0200, Jan Trippler wrote:
select SPALTENAME from TABELLENNAME where upper(SPALTENNAME) like upper('%SUCHWORT%';) ^^ typo?
Nein, das ist nicht besser, das ist was anderes. Dieser select führt eine case-insensitive Suche durch, der andere nicht.
In MySQL wird ein varchar case-insensitive vergleichen, es sei denn, - der varchar wurde mit dem Attribut binary deklariert oder - der Vergleich wurde im im SELECT Statement mit dem Attribut binary deklariert. Das o.a. Statement ist in jedem Fall langsam. Selbst wenn kein LIKE "%x%" verwendet werden würde, steht SPALTENNAME in einem Funktionsaufruf, und da MySQL anders als Oracle ab Version 8 keine Indices auf Funktionsresultaten anlegen kann, würde selbst für ein UPPER(SPALTENNAME) = 'SUCHWORT' kein Index verwendet werden. Dieses Konstrukt will man also unbedingt vermeiden. Es ist daher wichtig, in SPALTENNAME gleich kanonisierte Daten zu speichern (etwa: alle Worte in Großbuchstaben und mit expandierten Umlauten) und dann auch den Suchbegriff in der Anwendung zu kanonisieren. Auf diese Weise bekommen man select spaltenname from tabellenname where spaltenname = 'suchwort' und das geht gegen einen möglicherweise vorhandenen Index. Für LIKE '%x%' kann jedoch nie ein Index verwendet werden. Dies kann man korrigieren, indem man analysiert, welcher der beiden Fälle dieser Fehlkonstruktion zu Grunde liegt und entsprechend umbaut. Kristian
On Mon, 07 Jul 2003 at 10:03 (+0200), Kristian Koehntopp wrote:
On Sat, Jul 05, 2003 at 11:04:35PM +0200, Jan Trippler wrote:
select SPALTENAME from TABELLENNAME where upper(SPALTENNAME) like upper('%SUCHWORT%';) ^^ typo?
Nein, das ist nicht besser, das ist was anderes. Dieser select führt eine case-insensitive Suche durch, der andere nicht.
In MySQL wird ein varchar case-insensitive vergleichen, es sei denn,
- der varchar wurde mit dem Attribut binary deklariert oder - der Vergleich wurde im im SELECT Statement mit dem Attribut binary deklariert.
Ja, das hatte ich in meiner Mail weiter unten ja auch geschrieben. Aber trotzdem sind die selects ohne / mit UPPER() unterschiedlich. Denn der o. g. select sucht auch in einer mit binary deklarierten Tabellenspalte case-insensitiv. Auf diesen Unterschied wollte ich hinweisen.
Das o.a. Statement ist in jedem Fall langsam. Selbst wenn kein LIKE "%x%" verwendet werden würde, steht SPALTENNAME in einem Funktionsaufruf, und da MySQL anders als Oracle ab Version 8 keine Indices auf Funktionsresultaten anlegen kann, würde selbst für ein UPPER(SPALTENNAME) = 'SUCHWORT' kein Index verwendet werden. Dieses Konstrukt will man also unbedingt vermeiden. [...]
ACK, aber manchmal hat man als Anwendungsentwickler keinen Einfluss auf das DB-Design und dann muss man mit dem leben, was man vorgesetzt kriegt (z. B. bei zugekauften Datenbanken - Stichwort Deutsche Post). Man kann zwar in einigen Fällen solche Datenbanken in ein eigenes, passenderes DB-Modell importieren, aber zum Teil verbieten die Lizenzbedingungen oder die Update-Häufigkeit sowas. Jan
On Mon, Jul 07, 2003 at 01:14:57PM +0200, Jan Trippler wrote:
ACK, aber manchmal hat man als Anwendungsentwickler keinen Einfluss auf das DB-Design und dann muss man mit dem leben, was man vorgesetzt kriegt (z. B. bei zugekauften Datenbanken - Stichwort Deutsche Post).
Die Datenbank der Deutschen Post ist Schrott, dessen Design aus den 1970ern stammt und muß durch einen passenden Importer erst einmal normalisiert werden. Ich habe das mit den Azubis hier (http://www.netuse.de) im Rahmen unserer Datenbankausbildung einmal als Beispielprojekt durchgezogen. Die Performancevergleiche vorher/nachher waren sehr instruktiv für die - jetzt wissen sie auch, was Logarithmen sind. Kristian
On Mon, 07 Jul 2003 at 14:15 (+0200), Kristian Koehntopp wrote:
On Mon, Jul 07, 2003 at 01:14:57PM +0200, Jan Trippler wrote:
ACK, aber manchmal hat man als Anwendungsentwickler keinen Einfluss auf das DB-Design und dann muss man mit dem leben, was man vorgesetzt kriegt (z. B. bei zugekauften Datenbanken - Stichwort Deutsche Post).
Die Datenbank der Deutschen Post ist Schrott, dessen Design aus den 1970ern stammt und muß durch einen passenden Importer erst einmal normalisiert werden. Ich habe das mit den Azubis hier (http://www.netuse.de) im Rahmen unserer Datenbankausbildung einmal als Beispielprojekt durchgezogen. Die Performancevergleiche vorher/nachher waren sehr instruktiv für die - jetzt wissen sie auch, was Logarithmen sind.
Deshalb war mir das Beispiel in Erinnerung ;-) Ich habe das auch schon hinter mir, weiss aber nicht genau, ob das damals so richtig legal war (irgendwie habe ich noch im Hinterkopf, dass Auszüge aus der DB wohl nicht gestattet waren, kann mich aber auch irren - ist schon einige Jahre her). Jan
participants (14)
-
Adalbert Michelic
-
Daniel Lord
-
David Haller
-
DB-Webtech.de
-
Harald Land
-
Jan.Trippler@t-online.de
-
Joerg Rossdeutscher
-
Kristian Koehntopp
-
Manfred Tremmel
-
Martin Falley
-
Martin Mewes
-
Sascha Andres
-
Sebastian Giffhorn
-
Sven Schupp