JOIN? - MIN() als Ergebnis bzw in WHERE


k3nguruh

Erfahrenes Mitglied
Hallo @all, Hallo Yaslaw

Ich stehen mal wieder vor ein Problem... Es soll aus 2 Abfragen Eine gemacht werden. Ich gehe mal davon aus, dass das nur über ein JOIN funktioniert, aber wie ist die Frage....

Tabelle
Code:
| id | fahzeug_id | beginndatum | enddatum   | ....
| 1  |  1         | 2012-02-01  | 2013-05-05 | ....
| 2  |  1         | 2013-05-05  | 2014-01-01 | ....
| 3  |  1         | 2014-01-01  | NULL       | ....

Ich hoffe das man an den SELECTs erkennen kann, was ich meine
SQL:
SELECT *, MIN(beginndatum) FROM tabelle WHERE id = 3

SELECT 1 FROM tabelle WHERE id = 3 AND (enddatum IS NULL OR MAX(enddatum) > $_POST['datum'])

Bei dem 1. möchte ich gerne die Einträge von der "id" 3 haben und dazu das kleinste "beginndatum" zu der "fahrzeug_id".
Und bei der 2. soll nur geprüft werden, ob das $_POST['datum'] kleiner dem grössten "enddatum" oder "enddatum" NULL ist zu der "fahrzeug_id" mit der "id" 3 ist.

Weiterhelfen würde mir auch "nur" das 1. Select. Dann könnte ich das 2. mit PHP lösen. Wäre aber schon schön, wenn es auch per mySQL geht.

P.S.: Gibt es irgend wo eine gute Seite wo das mit den JOINs in deutsch erklärt wird?
 
Zuletzt bearbeitet von einem Moderator:

Yaslaw

n/a
Moderator
Wie wärs damit:
SQL:
SELECT 
    t.id, 
    MIN(t.beginndatum) AS min_beginndatum ,
    MIN(t.beginndatum)  < '{$datum}' AS flag
FROM
    t.tabelle 
WHERE 
    t.id = 3
GROUP BY
   t.id

item: Ich habe das $_POST extra entfernt. Immer brav zuerst mysql_escape_string auf Variablen aus $_POST anwenden

item: MIN() geht nur mit GROUP BY. Da ist nix mehr mit *
 
Zuletzt bearbeitet von einem Moderator:

k3nguruh

Erfahrenes Mitglied
Hallo,

Das mit den $_POST['datum'] und "mysql_escape_string" wollte ich noch zu schreiben ;) .... Es werden alle Eingaben von ausserhalb geprüft
SQL:
// Bsp:  sqlSmart($_POST['datum'])
function sqlSmart($string) {
    if (get_magic_quotes_gpc())
        $string = stripslashes($string);

    if (is_int($string))
        return $string;

    return mysql_real_escape_string($string);
}
aber das nur nebenbei...

Die 2 SELECTs von mir oben sind nicht die, die zusammengefügt werden sollen... Es sind 2 die ich haben möchte


Leider ergibt dein SELECT nicht das gewünschte Ergebnis. Es besteht auch irgend wie kein Bezug zur "fahrzeug_id".

beginndatum und MIN(beginndatum) sind gleich. MIN(beginndatum) sollte mir aber das Datum von der ID 1 anzeigen.
 
Zuletzt bearbeitet von einem Moderator:

Yaslaw

n/a
Moderator
DU hast ja die Prüfung auf id=3 drin. Da ist das MIN() immer das von der id =3.
Ersetz mal id durch fahrzeug_id
 

k3nguruh

Erfahrenes Mitglied
äähhmm

und wie komme ich dann an die weiteren Daten von der ID 3 ran?

nochmal die tabelle
Code:
| id | fahzeug_id | beginndatum | ....
| 1  |  1         | 2012-02-01  | ....
| 2  |  1         | 2013-05-05  | ....
| 3  |  1         | 2014-01-01  | ....

Das Ergebnis sollte so aussehen:
Code:
| id | fahzeug_id | beginndatum | .... | MIN(beginndatum)
| 3  |  1         | 2014-01-01  | .... | 2012-02-01
 

Yaslaw

n/a
Moderator
Achso, das willst du haben.

SQL:
SELECT 
    t.*, 
    (
        SELECT MIN(a.beginndatum) 
        FROM tabelle AS a
        WHERE a.fahrzeug_id = t.fahrzeug_id
    ) AS min_beginn
FROM 
    tabelle AS t
WHERE 
    t.id = 3
 
Zuletzt bearbeitet von einem Moderator:

k3nguruh

Erfahrenes Mitglied
Hallo,

funktioniert super...

gibt es vll zum 2. Select auch noch eine Lösung?
SQL:
SELECT 1 FROM tabelle WHERE id = 3 AND (enddatum IS NULL OR MAX(enddatum) > '{$datum}')
Es soll nur geprüft werden, ob das {$datum} kleiner dem grössten "enddatum" oder "enddatum" NULL ist zu der "fahrzeug_id" mit der "id" 3.

Oder anders gesagt .... prüfe alle Einträge mit der "fahrzeug_id" die zu der "id" 3 gehören, ob davon 1 "enddatum" NULL ist oder mind. 1 enddatum > {$datum} ist.

Ergebnis: Es wird ein "result" geliefert oder keines.


Wenn es nicht geht, werde ich es mit PHP lösen müssen.
 
Zuletzt bearbeitet:

Yaslaw

n/a
Moderator
Es geht - aber du solltest selber mal ein wenig SQL lernen.

Bring mal ein besseren Vorschlag als bisher

PS: Das über SQL zu lösen, dürfte performanter sein als in PHP