Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Komplizierte Abfrage

7 views
Skip to first unread message

Burkhard Schultheis

unread,
Feb 1, 2018, 3:07:49 AM2/1/18
to
Wir haben eine Tabelle mit diversen Spalten, darunter eine user_id und
getrennten Spalten für Datum und Uhrzeit. Ich möchte nun für jede
user_id Datum und Uhrzeit des letzten Eintrags abfragen. Das letzte
Datum bekomme ich ja ganz leicht:

select user_id, max(date) from <tabelle> group by 1;

Aber wie mache ich das, dass ich auch noch die letzte Uhrzeit zu diesem
Datum dazu bekomme. Ich müsste ja max(time) für dieses user_id und
max(date) abfragen.

Wie schaffe ich das?

Vielen Dank für jede konstruktive Hilfe!

Grüße
Burkhard

Gerome Muent

unread,
Feb 1, 2018, 4:44:21 AM2/1/18
to
Am 01.02.2018 um 09:07 schrieb Burkhard Schultheis:
> Wir haben eine Tabelle mit diversen Spalten, darunter eine user_id und
> getrennten Spalten für Datum und Uhrzeit.

Getrennte Spalten für Datum und Uhrzeit ist hier ein Design-Fehler der
DB-Tabelle. Nimm datetime als Typ und EINE Spalte.
Mit den ganzen date_format-funktionen kannst du doch daraus Datum und
Zeit machen.

SELECT DATE_FORMAT(..., "%Y-%m-%d") as datum, DATE_FORMAT(..., "%H:%i")
AS uhrzeit

Ich möchte nun für jede
> user_id Datum und Uhrzeit des letzten Eintrags abfragen. Das letzte
> Datum bekomme ich ja ganz leicht:
>
> select user_id, max(date) from <tabelle> group by 1;
>
> Aber wie mache ich das, dass ich auch noch die letzte Uhrzeit zu diesem
> Datum dazu bekomme. Ich müsste ja max(time) für dieses user_id und
> max(date) abfragen.
>
> Wie schaffe ich das?

Ich nehme an, du willst die letzte Uhrzeit am letzten Datum haben?

Wenn du den Designfehler nicht beheben willst, dann geht in etwa sowas
SELECT MAX(CONCAT(`date`, ' ', `time`)) FROM ....

Ich habe date und time bewußt in backticks geschrieben, weil du mit
unglücklichen Spaltennamen wie date aufpassen mußt, weil die reservierte
Wörter sind.

Grüße, Gérôme

Burkhard Schultheis

unread,
Feb 1, 2018, 6:01:36 AM2/1/18
to
Hallo Gérôme,

Am 01.02.2018 um 10:44 schrieb Gerome Muent:
> Am 01.02.2018 um 09:07 schrieb Burkhard Schultheis:
>> Wir haben eine Tabelle mit diversen Spalten, darunter eine user_id und
>> getrennten Spalten für Datum und Uhrzeit.
>
> Getrennte Spalten für Datum und Uhrzeit ist hier ein Design-Fehler der
> DB-Tabelle. Nimm datetime als Typ und EINE Spalte.

Ja, das abe ich auch gleich gedacht, als ich die Tabelle das erste Mal
gesehen habe. Da hängt aber natürlich ein ganzer Rattenschwanz dran. ;-)

>
> Wenn du den Designfehler nicht beheben willst, dann geht in etwa sowas
> SELECT MAX(CONCAT(`date`, ' ', `time`)) FROM ....

Danke, das löst mein Problem! Du hast mir sehr geholfen!

Grüße
Burkhard

Axel Schwenke

unread,
Sep 6, 2019, 10:05:47 AM9/6/19
to
On 06.09.2019 12:44, Josef Fluge wrote:
> I bringe es nicht zustande, folgende MySQL-Abfrage als MySQLi Prepared
> Statement zu formulieren.

Es ist wirklich gemein von mysqli, daß es dir keine Fehlermeldung zeigt!
SO. GE. MEIN!

...
> ORDER BY 'b_dat_bemerk.DatumID,
> b_gipfel.Gipfel,
> b_sonst_ziel.Sonstiges_Ziel'

Das meint etwas anderes als du wohl glaubst.

> AND b_dat_bemerk.Datum BETWEEN '$start_jahr' AND '$end_jahr'

Einer der Vorteile von prepared Statements ist, daß man keine Variablen in
den Querystring interpolieren muß, sondern hier Platzhalter verwendet, die
erst in der Execute Phase mit Werten besetzt werden. Bist du sicher, daß du
das Konzept "Prepared Statement" verstanden hast?

Axel Schwenke

unread,
Sep 6, 2019, 6:03:06 PM9/6/19
to
On 06.09.2019 20:33, Josef Fluge wrote:
> meine sehr lang geratene Abfrage in ein MySQLi Prepared Statement
> zu übersetzen, das gelingt mir nicht

So. Du hast den Wink mit dem Zaunpfahl also nicht verstanden.

"Gelingt mir nicht" ist keine Fehlerbeschreibung, bei der dir *irgend*
jemand helfen könnte. Zeig eine konkrete Fehlermeldung. Bzw. laß sie dir
überhaupt erstmal ausgeben und lies sie selber. Wahrscheinlich ist es etwas
ganz triviales.

Claus Reibenstein

unread,
Sep 7, 2019, 6:38:42 AM9/7/19
to
Josef Fluge schrieb am 07.09.2019 um 12:22:

> Es gibt keine Fehlermeldung, weil ich nicht weiss, wie ich so einen
> "langen Wurm" per Prepared Statement überhaupt verarbeiten soll.

Du benutzt offensichtlich PHP. Dein Problem scheint mir deshalb in
de.comp.lang.php besser aufgehoben zu sein als hier.

Gruß
Claus

Claus Reibenstein

unread,
Sep 7, 2019, 6:49:48 AM9/7/19
to
Josef Fluge schrieb am 06.09.2019 um 12:44:

> I bringe es nicht zustande, folgende MySQL-Abfrage als MySQLi Prepared
> Statement zu formulieren. Es ist eine Abfrage über mehrere Tabellen.

Im Prinzip ganz einfach: Du ersetzt alle variablen Werte durch ein
Fragezeichen und benutzt dann die entsprechenden Funktionen der von Dir
gewählten Programmiersprache (PHP?), um die Werte an das Statement zu
binden.

So weit ich das sehe, gibt es in Deinem Statement genau eine Zeile, die
geändert werden muss:

> AND b_dat_bemerk.Datum BETWEEN '$start_jahr' AND '$end_jahr'

Daraus wird:

AND b_dat_bemerk.Datum BETWEEN ? AND ?

Den Rest entnimmst Du bitte der Doku zur Programmiersprache oder
richtest weitere Fragen in der dazu gehörenden Gruppe.

Einen Fehler solltest Du vorher aber noch korrigieren:

> ORDER BY 'b_dat_bemerk.DatumID,
> b_gipfel.Gipfel,
> b_sonst_ziel.Sonstiges_Ziel'

Die Anführungsstriche müssen weg.

Gruß
Claus

Axel Schwenke

unread,
Sep 7, 2019, 8:07:49 AM9/7/19
to
On 07.09.2019 12:22, Josef Fluge wrote:
> On Sat, 7 Sep 2019 00:03:05 +0200, Axel Schwenke
> <axel.s...@gmx.de> wrote:
>
>> So. Du hast den Wink mit dem Zaunpfahl also nicht verstanden.
>>
>> "Gelingt mir nicht" ist keine Fehlerbeschreibung, bei der dir *irgend*
>> jemand helfen könnte. Zeig eine konkrete Fehlermeldung
>
> Ich erwarte hier keinen Wink mit dem Zaunpfahl, sondern nach
> Möglichkeit Hilfe.

Hilfe wobei? Niemand hier weiß was du tust, oder was dabei schief geht. Wenn
du die Dienstleistung des Hellsehens benötigst, dann bist du hier falsch.

> Es gibt keine Fehlermeldung, weil ich nicht weiss, wie ich so einen
> "langen Wurm" per Prepared Statement überhaupt verarbeiten soll.

Mit anderen Worten, du hast die Anleitung zu mysqli nicht gelesen. Oder auch
nur /versucht/, damit zu arbeiten. Fang doch damit an. Und wenn du dann
immer noch Fragen zu MySQL (nicht: mysqli oder PHP) hast, dann komm wieder.

Axel Schwenke

unread,
Sep 7, 2019, 5:02:21 PM9/7/19
to
On 07.09.2019 20:19, Josef Fluge wrote:
>
> Asche auf mein Haupt. Erst bei meiner Antwort an
> C.Reibenstein ist mir aufgefallen, dass ich mein Kernproblem nicht
> formuliert habe

Ach!

> Was alles von meinem langen Wurm ist in
> $stmt->bind_result() einzugliedern ?

Vom Query-String? Nichts.

Mit mysqli_stmt::bind_result() bindest du PHP Variablen an Ergebnis-Spalten.
In diesen Variablen hinterlegt mysqli_stmt::fetch() dann die Werte der
gerade gelesenen Zeile des Ergebnisses. Die Doku zu mysqli ist doch
glasklar. Sogar Beispiele gibt es.

Zähl durch wieviele Spalten dein SELECT liefert. So viele PHP Variablen
brauchst du für mysqli_stmt::bind_result().

Claus hatte recht. Du hast keine MySQL-Frage, sondern eine PHP-Frage.

0 new messages