Komplexes mysql_query

vielleicht passt es besser in Datenbanken, aber da trau’ ich mich nicht so recht fragen *g*

mein Problem ist folgendes: Ich möchte eine komplexe Suchmaske für eine Datenbank schreiben… in der Datenbank sind unter anderem Felder für Handy, Privat und Geschäftstelefonnummer… Nun möchte ich aber nach möglichkeit die suchfelder verbinden - aber nicht zwangsweise mit einem „or“ sondern vielleicht eben auch mit einem „and“…
Mein Problem ist dabei dass ich eigentlich nur ein Feld für die Telefonnummernsuche machen möchte…
sprich die felder für die 3 telefonnummern müssten mit OR durchsucht werden. Verwende ich aber gleichzeitig ein AND dann bekomme ich theoretisch ja alle Ergebnisse und nicht die, in der z.B. der name auch xyz ist… im mysql manual finde ich logischerweise bei der suche nach „WHERE“ nicht allzuviel weil es zu oft im Text vorkommt - im php-manual wird es offenbar garnicht tangiert :confused:

ergänzende Frage zum Thema
gibt es einen Befehl, der in allen Spalten sucht?
Wäre zwar sicher etwas unperformant, ist aber nur für das administrative interface gedacht also nicht sooo tragisch

vielleicht passt es besser in Datenbanken, aber da trau’ ich
mich nicht so recht fragen *g*

wenn du die frage nach sql for dummies stellst, wird man dir sicher einen guten tipp geben koennen :wink:

mein Problem ist folgendes: Ich möchte eine komplexe Suchmaske
für eine Datenbank schreiben… in der Datenbank sind unter
anderem Felder für Handy, Privat und Geschäftstelefonnummer…
Nun möchte ich aber nach möglichkeit die suchfelder verbinden

  • aber nicht zwangsweise mit einem „or“ sondern vielleicht
    eben auch mit einem „and“…
    Mein Problem ist dabei dass ich eigentlich nur ein Feld für
    die Telefonnummernsuche machen möchte…
    sprich die felder für die 3 telefonnummern müssten mit OR
    durchsucht werden.

$sql = „select wasauchimmer from tabelle where handy like ‚%$nummer%‘ or festnetz like ‚%$nummer‘“;

wobei in $nummer die gewuenschte nummer steht.

Verwende ich aber gleichzeitig ein AND dann
bekomme ich theoretisch ja alle Ergebnisse und nicht die, in
der z.B. der name auch xyz ist…

warum und wofuer wolltest du denn ein and nutzen? beachte auch, dass du einzelne bedingungen mit klammern verknuepfen kannst…

logischerweise bei der suche nach „WHERE“ nicht allzuviel weil
es zu oft im Text vorkommt -

lies alles unter punkt
6 MySQL Language Reference insbes.
6.3 Functions for Use in SELECT and WHERE Clauses

im php-manual wird es offenbar
garnicht tangiert :confused:

irgendwie naheliegend, nciht?

gibt es einen Befehl, der in allen Spalten sucht?

nein, in sql geht es immer darum:

gib mir spaltex, spaltey und spaltez aller zeilen der tabelle tabellex die in der spaltea den wert foo haben.

wobei foo

  • eine referenz auf eine andere spalte der gleichen zeile, oder
  • eine referenz auf eine andere spalte einer anderen tabelle, oder
  • das ergebnis einer funktion
  • oder ein wert
    sein kann.

du kannst aber fragen:
select spaltex from tabellex where concat(handy,festnetz,name) like ‚%suchwort%‘;

da das dann aber sqltechnisch tatsaechlich eine gnadenlose schweinerei ist, bin ich froh, dass ich dir die antwort nicht in datenbanken allgemein gegeben habe.

1 Like

gibt es einen Befehl, der in allen Spalten sucht?
Wäre zwar sicher etwas unperformant, ist aber nur für das
administrative interface gedacht also nicht sooo tragisch

ne sowas gibts nicht, macht auch irgendwie keinen sinn meinste nicht ?! :smile:

Danke für die Schnelle antwort

wenn du die frage nach sql for dummies stellst, wird man dir
sicher einen guten tipp geben koennen :wink:

*g*

$sql = „select wasauchimmer from tabelle where handy like
‚%$nummer%‘ or festnetz like ‚%$nummer‘“;

wusste ich schon, war nicht gefragt *g* trotzdem danke

Verwende ich aber gleichzeitig ein AND dann
bekomme ich theoretisch ja alle Ergebnisse und nicht die, in
der z.B. der name auch xyz ist…

warum und wofuer wolltest du denn ein and nutzen? beachte
auch, dass du einzelne bedingungen mit klammern verknuepfen
kannst…

das mit den Klammern wird genau das sein, was ich brauche…
Zum warum:
wenn ich ein Query auf eine 1 in der telefonnummer sende dann kriege ich vermutlich viele Ergebnisse. Um die weiter filtern zu können, muss ich eine AND Bedingung einfügen - mit OR werden es ja nur immer mehr resultate…

logischerweise bei der suche nach „WHERE“ nicht allzuviel weil
es zu oft im Text vorkommt -

lies alles unter punkt
6 MySQL Language Reference insbes.
6.3 Functions for Use in SELECT and WHERE Clauses

d’oh - ich hatte unter 5. MySQL Optimisation und 5.2 Optimising SELECTs and Other Queries gesucht… vielen Dank.

im php-manual wird es offenbar
garnicht tangiert :confused:

irgendwie naheliegend, nciht?

schon, aber nachdem sie so perfekt ineinandergreifen hätte es ja sein können :smiley:

doch, schon :smiley:
vor allem dann wenn ich nur ein SQL Eingabefeld habe und die Tabellenspalten nicht kenne…

gut, ich könnte ein describe table machen, aber wenn die Ausgabe limitiert ist auf 20 ergebnisse bringt mich das nicht immer weiter :wink:

*lach*

gibt es einen Befehl, der in allen Spalten sucht?

nein, in sql geht es immer darum:

gib mir spaltex, spaltey und spaltez aller zeilen der tabelle
tabellex die in der spaltea den wert foo haben.

wobei foo

  • eine referenz auf eine andere spalte der gleichen zeile,

kenn ich :smile:)

oder

  • eine referenz auf eine andere spalte einer anderen tabelle,

schon mal gesehen glaub ich LEFT JOIN oder so war das, oder? (ist mir im Moment noch zu hoch)

oder

  • das ergebnis einer funktion

hmm? gänzlich unbekannt… Du meinst ich kann in das mysql query ein WHERE test() einbauen und der gibt mir dann nur die Sätze zurück, bei dem die Funktion test true zurückgibt?

  • oder ein wert

hmmm ich dachte das war schon im ersten? o_O

sein kann.

du kannst aber fragen:
select spaltex from tabellex where concat(handy,festnetz,name)
like ‚%suchwort%‘;

da das dann aber sqltechnisch tatsaechlich eine gnadenlose
schweinerei ist, bin ich froh, dass ich dir die antwort nicht
in datenbanken allgemein gegeben habe.

warum ist das eine gnadenlose schweinerei? :smile:
Der Befehl ist klasse, ansonsten müsste ich mir einen ellenlangen WHERE-String definieren…?

gibt es einen Befehl, der in allen Spalten sucht?

nein, in sql geht es immer darum:

gib mir spaltex, spaltey und spaltez aller zeilen der tabelle
tabellex die in der spaltea den wert foo haben.

wobei foo

  • das ergebnis einer funktion

hmm? gänzlich unbekannt… Du meinst ich kann in das mysql
query ein WHERE test() einbauen und der gibt mir dann nur die
Sätze zurück, bei dem die Funktion test true zurückgibt?

naja alle funktionen unter 6.3 Functions for Use in SELECT and WHERE Clauses

  • oder ein wert

hmmm ich dachte das war schon im ersten? o_O

where spalte=„blubber“ ist ein wert.

du kannst aber fragen:
select spaltex from tabellex where concat(handy,festnetz,name)
like ‚%suchwort%‘;

da das dann aber sqltechnisch tatsaechlich eine gnadenlose
schweinerei ist, bin ich froh, dass ich dir die antwort nicht
in datenbanken allgemein gegeben habe.

warum ist das eine gnadenlose schweinerei? :smile:
Der Befehl ist klasse, ansonsten müsste ich mir einen
ellenlangen WHERE-String definieren…?

das problem ist halt, dass er fuer jede zeile (das ist schon mal ien fulltablescan - boese) den concat machen muss, und dann pruefen muss, ob der string enthalten ist. wenn du wie an anderer stelle von dir gesagt mehrere werte pruefen willst muesstest du das so notieren:
where concat(handy,festnetz,name) like ‚%suchwort%‘ or concat(handy,festnetz,name) like ‚%suchwort1%‘ - dann muss er schon 2x den concat machen, fuer jede zeile.

prinzipiell sollte man einen db-server nur nach spalten fragen, auf die er einen index hat. sonst wird es schnell langsam - und man koennte dann genausogut einen grep auf eine textdatei machen - ist das selbe.

vor allem dann wenn ich nur ein SQL Eingabefeld habe und die
Tabellenspalten nicht kenne…

die kriegt man ja zu not alle mit einem query vorher lückenlos raus…

verrätst Du mir dieses query?
*liebguck* :smile:

RTFM: DESCRIBE TABLE oder so, mussu mal in der doku gucken. Wenns das doch nicht war ein SELECT * und dann haste ja in php die Spaltennamen und kannst die zur Not durchgehen