SELECT...AS im WHERE-Clause

SELECT...AS im WHERE-Clause

am 29.07.2007 20:38:49 von Frank Ehrlacher

Hallo,

ich habe in einer Tabelle 2 Datumsfelder - diese sollen nun in einer
MySQL-Abfrage verwendet werden, ob sie größer einer Variablen XYZ sind ...
und wenn, dann soll nach DEM Feld sortiert werden, dass sie Bedingung
erfüllt, also ungefähr:

"SELECT * FROM table WHERE (datum1 > '$xyz') or (datum2 > '$xyz' ) ORDER BY
*???*""

Was aber gebe ich nun in die "Order" Bedingung?
Ich stellte mir etwas analog wie "SELECT field1,field2 AS col_xy ... ORDER
BY col_xy" vor - das müsste aber in dem Fall

"SELECT * FROM table WHERE (datum1 AS col_xy > '$xyz') or (datum2 AS col_xy
> '$xyz' ) ORDER BY *???*"" heißen - und das funktioniert nicht.

Kennt jemand eine Lösung oder einen Tipp/Quelle?

Danke und Grüße

Frank

Re: SELECT...AS im WHERE-Clause

am 29.07.2007 22:26:46 von Joachim Zobel

Am Sonntag, den 29.07.2007, 20:38 +0200 schrieb Frank Ehrlacher:
> Hallo,
>=20
> ich habe in einer Tabelle 2 Datumsfelder - diese sollen nun in einer=20
> MySQL-Abfrage verwendet werden, ob sie größer einer Variablen XYZ sin=
d ...=20
> und wenn, dann soll nach DEM Feld sortiert werden, dass sie Bedingung=20
> erfüllt, also ungefähr:
>=20
> "SELECT * FROM table WHERE (datum1 > '$xyz') or (datum2 > '$xyz' ) ORDER =
BY=20
> *???*""

Du meinst evtl. WHERE MAX(datum1, datum2) > '$xyz' ORDER BY MAX(datum1,
datum2)

Gruß,
Joachim

Re: SELECT...AS im WHERE-Clause

am 30.07.2007 22:25:44 von Frank Ehrlacher

>Du meinst evtl. WHERE MAX(datum1, datum2) > >'$xyz' ORDER BY MAX(datum1,
>datum2)

Hallo Joachim,

Danke, aber leider nicht :-(

Ich hatte das vereinfacht dargestellt, die richtige Abfrage lautet so in
etwa "where (datum1 > $anfang and datum 1 < $ende) or (datum2 > $anfang and
datum 2 < $ende)"

Also Beispieltabelle:

DATUM1 DATUM2
AAAA 15.08.2007 ***
BBBB *** 30.08.2007
CCCC 02.08.2007 ****
(die Werte mit "***" sind beliebig außerhalb des 'Ergebnisberieches')

Die Abfrage soll jetzt bei $anfang=01.08.2007 und Ende=31.08.2007 alle Werte
finden, die dazwischen liegen und die dann nach dem TREFFERFELD sortieren,
also die Ausgabe soll lauten

CCCC 02.08.2007
AAAA 15.08.2007
BBBB 31.08.2007

Hoffe, das hilft bei der 'Lösung'.
Wäre sehr dankbar.

Viele Grüße

Frank

Re: SELECT...AS im WHERE-Clause

am 30.07.2007 23:09:49 von Matthias Moers

Hallo,

> >Du meinst evtl. WHERE MAX(datum1, datum2) > >'$xyz' ORDER BY
> >MAX(datum1,
>>datum2)
>
> [...]
>
> Ich hatte das vereinfacht dargestellt, die richtige Abfrage lautet so
> in etwa "where (datum1 > $anfang and datum 1 < $ende) or (datum2 >
> $anfang and datum 2 < $ende)"

vielleicht so:

SELECT *
FROM table
WHERE (datum1 > $anfang and datum 1 < $ende) or (datum2 > $anfang and >
datum 2 < $ende)
ORDER BY IF(datum1 > $anfang and datum1 < $ende, datum1, datum2)

Gruß,
Matthias

Re: SELECT...AS im WHERE-Clause

am 30.07.2007 23:24:08 von Udo Neist

Matthias Moers wrote:

> SELECT *
> FROM table
> WHERE (datum1 > $anfang and datum 1 < $ende) or (datum2 > $anfang
> and > datum 2 < $ende)
> ORDER BY IF(datum1 > $anfang and datum1 < $ende, datum1, datum2)

Wäre da nicht BETWEEN sinnvoller als die beiden Klammern im
WHERE-Statement?

Gruß
Udo

Re: SELECT...AS im WHERE-Clause

am 03.08.2007 18:37:03 von Frank Ehrlacher

> vielleicht so:
>
> SELECT *
> FROM table
> WHERE (datum1 > $anfang and datum 1 < $ende) or (datum2 > $anfang and >
> datum 2 < $ende)
> ORDER BY IF(datum1 > $anfang and datum1 < $ende, datum1, datum2)

Leider nicht ... Damit sortiert er erst alle Felder, die in der Range
liegen, nach datum 1, dann alle felder außerhalb dieser Range nach "datum 2"
..

Ziel ist es, dass er quasi die Felder, bei denen "datum 2" innerhalb der
Range liegt, bei den "datum 1-feldern" einsortiert. Würde tippen, das geht
nur, in dem ich dem datum 1 bzw. datum 2 ein neues feld zuweise ... aber ich
krieg das auch nicht hin ...

Re: SELECT...AS im WHERE-Clause

am 03.08.2007 19:50:57 von dnoeth

Frank Ehrlacher wrote:

>> SELECT *
>> FROM table
>> WHERE (datum1 > $anfang and datum 1 < $ende) or (datum2 > $anfang and >
>> datum 2 < $ende)
>> ORDER BY IF(datum1 > $anfang and datum1 < $ende, datum1, datum2)
>
> Leider nicht ... Damit sortiert er erst alle Felder, die in der Range
> liegen, nach datum 1, dann alle felder außerhalb dieser Range nach
> "datum 2" .

Nein.

> Ziel ist es, dass er quasi die Felder, bei denen "datum 2" innerhalb der
> Range liegt, bei den "datum 1-feldern" einsortiert. Würde tippen, das
> geht nur, in dem ich dem datum 1 bzw. datum 2 ein neues feld zuweise ...
> aber ich krieg das auch nicht hin ...

Das ist aber im Prinzip genau das, was Matthias geschrieben hat.
Ich hätte nur ein CASE draus gemacht:
order by
case
when (datum1 > $anfang and datum 1 < $ende)
then datum1
else datum2
end

Dieter