mysql-Frage: IF
split.s
- datenbank
Ich habe folgendes Problem: Ich vergleiche zwei Tabellen miteinander, wobei ich NICHT weiss, ob ein Wert NULL ist.
Hier ein Muster:
SELECT user.name FROM user.alter < suche.alter
Das Problem: suche.alter kann auch NULL sein! In diesem Fall möchte ich nicht danach suchen.
Ich bräuchte also sowas:
SELECT user.name FROM IF(suche.alter IS NOT NULL, user.alter < suche.alter,SONST-NIX-MACHEN);
Hello,
SELECT user.name FROM user.alter < suche.alter
was ist denn hier from und was ist where und überhaupt: wo willst du hin?
Eine syntaktische Verknüpfung von user.alter<suche.alter mit OR bzw. AND und IS NULL oder IS NOT NULL ist möglich.
MfG
Rouven
Hello,
»» SELECT user.name FROM user.alter < suche.alter
was ist denn hier from und was ist where und überhaupt: wo willst du hin?Eine syntaktische Verknüpfung von user.alter<suche.alter mit OR bzw. AND und IS NULL oder IS NOT NULL ist möglich.
MfG
Rouven
WHERE habe ich lediglich vergessen:
SELECT user.name FROM user, suche WHERE user.alter < suche.alter
Ich möchte: user.alter < suche.alter (Das Alter der Benutzer soll kleiner sein, als das der Suchabfrage. Es kann aber sein, dass in der Suchabfrage kein Alter angegeben ist. Dann wäre dort das Alter NULL)
Es kann also sein, dass suche.alter gleich NULL ist! Das hätte folgendes zur Folge:
... WHERE user.alter < NULL
Hello,
SELECT user.name FROM user, suche WHERE user.alter < suche.alter
du hast eine Suchabfrage in der Tabelle gespeichert? Das erscheint mir zwar wenig sinnvoll, aber vmtl. weißt du besser als ich was du da machst...
Für Joins empfiehlt sich im allgemeinen eine explizite Schreibweise, sie weist klar aus, was wie zusammengehört, vgl. unsere Datenbankartikel zu Joins.
Es kann also sein, dass suche.alter gleich NULL ist! Das hätte folgendes zur Folge:
du sprichst bildlich, oder? Das Statement bleibt ja unverändert. Du möchtest also alle Datensätze, bei denen das alter kleiner ist als die Suchangabe, oder bei denen es gar keine Suchangabe gibt. Hervorragende Anwendung für einen LEFT-JOIN:
SELECT user.name
FROM user LEFT JOIN suche
ON user.alter < suche.alter
Alternativ in einer Nicht-Left-Join-Variante:
SELECT user.name
FROM user, suche
WHERE (user.alter < suche.alter) OR (suche.alter IS NULL)
Irgendetwas sagt mir aber, dass du in beiden Fällen noch nicht so 100% dein erwartetes Ergebnis bekommen wirst, da du defacto ein volles Kreuzprodukt bildest und davon doch eine ganze Menge an Sätzen überbehälst. Aber wie gesagt, du wirst deine Datenstruktur besser kennen als ich.
MfG
Rouven
yo Rouven,
wenn ich sie richtig verstanden habe, dann ist "suche.alter" keine neue tabelle, sondern einfach nur eine variable, die von aussen kommt....
Ilja
yo Rouven,
wenn ich sie richtig verstanden habe, dann ist "suche.alter" keine neue tabelle, sondern einfach nur eine variable, die von aussen kommt....
Ilja
Es gibt zwei Tabellen:
suche:
id MEDIUMINT(8) UNSIGNED AUTO_INCREMENT PRIMARY KEY
alter INT(2) NULL
geschlecht TINYINT(2) NULL
user:
id MEDIUMINT(8) UNSIGNED AUTO_INCREMENT PRIMARY KEY
name VARCHAR(255) NOT NULL
alter INT(2) NULL
geschlecht TINYTINT(2) NOT NULL
in der suche-Tabelle sind Suchparameter gespeichert.
In der user-Tabelle befinden sich die Benutzer, die durchsucht werden sollen, und zwar so:
SELECT user.name FROM suche, user WHERE user.geschlecht = suche.geschlecht AND user.alter = suche.alter
Mein Problem ist nur folgendes:
Wenn suche.alter oder suche.geschlecht gleich NULL ist, dann sucht er in der user-Tabelle auch nach NULL-Werten!
Ich will aber, dass er die Bedingung dann garnicht abfragt!
Also ich will im prinzip sowas:
SELECT user.name FROM suche, user WHERE IF(suche.geschlecht IS NOT NULL, user.geschlecht = suche.geschlecht, '') AND IF(suche.alter IS NOT NULL, user.alter = suche.alter, '')
yo,
Ich möchte: user.alter < suche.alter (Das Alter der Benutzer soll kleiner sein, als das der Suchabfrage. Es kann aber sein, dass in der Suchabfrage kein Alter angegeben ist. Dann wäre dort das Alter NULL)
unabhängig, von wo der wert herkommt, enie variable oder als unterabfrage, musst du dir erst enimal überlegen, was du dann haben willst, wenn der Wert NULL ist (NULL <> ''). wilsst du dann alle anzeigen, die dort kein alter angegeben haben oder willst du dann grundsätzliche alle anzeigen ?
Ilja
Hi ilja,
Wenn suche.alter NULL ist, dann soll keine Altersbegrenzung stattfinden.
Anders formuliert: Wenn suche.alter NULL ist, soll das Alter garnicht abgefragt werden weil dann will der Benutzer ja auch keins haben.
yo,
Anders formuliert: Wenn suche.alter NULL ist, soll das Alter garnicht abgefragt werden weil dann will der Benutzer ja auch keins haben.
entweder passt du die sql query an, je nachdem ob es dort einen NULL wert gibt oder nicht. oder aber du benutzt einen trick, indem du eine funktion einsetzt, die nach NULL prüft und wenn der inhalt NULL ist, dann einen anderen wert einsetzt und zwar user.alter + 1. damit stellst du sicher, dass die Bedingung immer erfüllt ist und somit jedes alter angezeigt wird.
Ilja
wilsst du dann alle anzeigen, die dort kein alter angegeben haben oder willst du dann grundsätzliche alle anzeigen ?
Ilja
Letzteres!!!!!