Abfrage über zwei Tabellen / neuester Datensatz

Abfrage über zwei Tabellen / neuester Datensatz

am 22.03.2006 00:16:35 von tmueller

Hallo NG,

ich habe ein kleines Problem mit einer MySQL-Abfrage. :-/

Es gibt zwei Tabellen:

Tabelle 1:

tabelle_ticket
ticket_id int(11)
ticket_betreff varchar(100)

Tabelle 2:

tabelle_history
history_id int(11)
history_ticket_id int(11)
history_datum datetime
history_text varchar(100)

Folgendes Problem:

Zu jedem Ticket (Tabelle 1) gibt es einen oder mehrere History-Einträge
(Tabelle 2).
Nun bin ich auf der Suche nach einer Abfrage welche mir alle Tickets mit dem
jeweils neuesten History-Eintrag ausgibt.

Folgende Abfrage gibt mir zu jedem Ticket alle vorhandenen History-Einträge
aus

select * from tabelle_ticket, tabelle_history
where tabelle_history.history_ticket_id = tabelle_ticket.ticket_id
order by ticket_id desc,history_id desc

Bau ich nun ein "group by ticket_id" ein erhalte ich zwar nur noch jeweils
eine Zeile pro Ticket, aber der History-Eintrag ist nicht der jeweils
neueste sondern wird wohl zufällig gewählt.

select * from tabelle_ticket, tabelle_history
where tabelle_history.history_ticket_id = tabelle_ticket.ticket_id
group by ticket_id
order by ticket_id desc,history_id desc

Ich verwende Mysql V4.1.10 bzw. V4.1.1.

Vielen Dank im Voraus,
Thomas

Re: Abfrage über zwei Tabellen / neuester Datensatz

am 22.03.2006 02:17:19 von Johannes Vogel

Hi Thomas

Thomas Müller wrote:
> Es gibt zwei Tabellen:
> tabelle_ticket
> tabelle_history
>
> Zu jedem Ticket (Tabelle 1) gibt es einen oder mehrere History-Einträge
> (Tabelle 2).
> Nun bin ich auf der Suche nach einer Abfrage welche mir alle Tickets mit dem
> jeweils neuesten History-Eintrag ausgibt.

> Bau ich nun ein "group by ticket_id" ein erhalte ich zwar nur noch jeweils
> eine Zeile pro Ticket, aber der History-Eintrag ist nicht der jeweils
> neueste sondern wird wohl zufällig gewählt.

Theoretisch ist das so, praktisch wird der erste Eintrag verwendet (was
ja irgendwie auch Sinn macht). Das kannst du ausnutzen:

> select * from tabelle_ticket, tabelle_history
> where tabelle_history.history_ticket_id = tabelle_ticket.ticket_id
> group by ticket_id
> order by ticket_id desc,history_id desc
> Ich verwende Mysql V4.1.10 bzw. V4.1.1.

select t.id, t.betreff, h.id, h.datum, h.text
from Tickets t
join (select id, idTickets, datum, text
from History order by datum desc) as h
where t.state = 'open'
group by t.id
order by h.datum asc;

Dein Naming empfinde ich als kaputt. Du nennst dich selbst auch nicht
Mensch_Thomas o.ä. Streich das tabelle_ raus - dasselbe gilt auch für
die Attributsbezeichnungen.

Das order by habe ich auf h.datum gesetzt, weil ich denke, dass du das
als letztes bearbeitete Ticket zu unterst haben möchtest. Eigentlich
wäre ein Status gut, der zu jedem Ticket festlegt, ob's noch neu, in
Bearbeitung oder bereits geschlossen sei. Dann kannst du erst nach
diesem Feld sortieren. Alle offenen würde ich dann aber so sortieren,
dass das älteste zu oberst liegt. FIFO also.
Ebenfalls als Ansporn: Ein Attribut, das bei jedem Ticket vermerkt, wer
der nächste Input-Lieferant ist. Liegt der nächste Schritt beim Kunden
oder beim Supporter...

HTH, Johannes

Re: Abfrage über zwei Tabellen / neuester Datensatz

am 22.03.2006 09:03:17 von tmueller

"Johannes Vogel" schrieb im Newsbeitrag
news:4420a5a0_2@news.bluewin.ch...
>
> HTH, Johannes

Danke schön, werde ich gleich mal testen. ;)

Viele Grüße,
Thomas

Re: Abfrage über zwei Tabellen / neuester Datensatz

am 22.03.2006 09:26:32 von Dirk Brosowski

Johannes Vogel schrieb:
> Hi Thomas
>
> Thomas Müller wrote:
>
>> Es gibt zwei Tabellen:
>> tabelle_ticket
>> tabelle_history
>>
>> Zu jedem Ticket (Tabelle 1) gibt es einen oder mehrere
>> History-Einträge (Tabelle 2).
>> Nun bin ich auf der Suche nach einer Abfrage welche mir alle Tickets
>> mit dem jeweils neuesten History-Eintrag ausgibt.
>
>
>> Bau ich nun ein "group by ticket_id" ein erhalte ich zwar nur noch
>> jeweils eine Zeile pro Ticket, aber der History-Eintrag ist nicht der
>> jeweils neueste sondern wird wohl zufällig gewählt.
>
>
> Theoretisch ist das so, praktisch wird der erste Eintrag verwendet (was
> ja irgendwie auch Sinn macht). Das kannst du ausnutzen:


Auf dieser Annahme und damit auch auf Glück willst du doch nicht
wirklich eine Applikation aufbauen, oder?

Ich würde Subselects verwenden, damit sollte das auf jeden Fall auch gehen.

Grüße

Dirk

Re: Abfrage über zwei Tabellen / neuester Datensatz

am 22.03.2006 10:04:10 von tmueller

Hallo Dirk,

wie würde so ein Subselect aussehen?
Hab das zwar schon mal probiert, aber kein vorzeigbares Ergebnis erreicht.
:-/
Hast du du bitte noch ein paar Infos für mich.

Vielen Dank im Voraus,
Thomas

"Dirk Brosowski" schrieb im Newsbeitrag
news:48cg1dFj9aplU1@individual.net...
>
> Auf dieser Annahme und damit auch auf Glück willst du doch nicht wirklich
> eine Applikation aufbauen, oder?
>
> Ich würde Subselects verwenden, damit sollte das auf jeden Fall auch
> gehen.
>
> Grüße
>
> Dirk

Re: Abfrage überzwei Tabellen / neuester Datensatz

am 22.03.2006 16:16:17 von Harald Fuchs

In article <48cg1dFj9aplU1@individual.net>,
Dirk Brosowski writes:

> Johannes Vogel schrieb:
>> Hi Thomas
>> Thomas Müller wrote:
>>
>>> Es gibt zwei Tabellen:
>>> tabelle_ticket
>>> tabelle_history
>>>
>>> Zu jedem Ticket (Tabelle 1) gibt es einen oder mehrere
>>> History-Einträge (Tabelle 2).
>>> Nun bin ich auf der Suche nach einer Abfrage welche mir alle
>>> Tickets mit dem jeweils neuesten History-Eintrag ausgibt.
>>
>>> Bau ich nun ein "group by ticket_id" ein erhalte ich zwar nur noch
>>> jeweils eine Zeile pro Ticket, aber der History-Eintrag ist nicht
>>> der jeweils neueste sondern wird wohl zufällig gewählt.
>> Theoretisch ist das so, praktisch wird der erste Eintrag verwendet
>> (was ja irgendwie auch Sinn macht). Das kannst du ausnutzen:


> Auf dieser Annahme und damit auch auf Glück willst du doch nicht
> wirklich eine Applikation aufbauen, oder?

> Ich würde Subselects verwenden, damit sollte das auf jeden Fall auch ge=
hen.

Alternativ könnte man mal, wenn das hier nicht verpönt wäre, einen
kurzen Blick ins Manual riskieren: dem Thema

The Rows Holding the Group-wise Maximum of a Certain Field

ist dort ein ganzes Kapitel gewidmet.

Re: Abfrage über zwei Tabellen / neuester Datensatz

am 22.03.2006 16:37:37 von Andreas Pankratz

Hallo,

ich hab mich mal ein bißchen gespielt, folgendes Query sollte
funktionieren (auch 4.x)

SELECT
t1.ticket_id AS actid,
t1.ticket_text,
t2.status_datetime
FROM
t1
INNER JOIN
t2
ON
t1.ticket_id =3D t2.ticket_id
WHERE
t2.status_datetime =3D (SELECT t2.status_datetime FROM t2 WHERE ticket_id
=3D actid ORDER BY t2.status_datetime DESC LIMIT 1)
GROUP BY
t1.ticket_id


Gruß
Andreas

Re: Abfrage überzwei Tabellen / neuester Datensatz

am 22.03.2006 20:31:00 von Dirk Brosowski

Harald Fuchs schrieb:
> In article <48cg1dFj9aplU1@individual.net>,
> Dirk Brosowski writes:
>>Ich würde Subselects verwenden, damit sollte das auf jeden Fall auch gehen.
>
>
> Alternativ könnte man mal, wenn das hier nicht verpönt wäre, einen
> kurzen Blick ins Manual riskieren: dem Thema
>
> The Rows Holding the Group-wise Maximum of a Certain Field
>
> ist dort ein ganzes Kapitel gewidmet.

Naiv wie ich bin, bin ich davon ausgegangen, dass zu diesem Thema kein
Manualeintrag existieren wird. Schließlich wirft man dort doch erst
einen Blick hinein, bevor man hier fragt ;)

Greetings

P.S.: Ich hätte sowas spezielles dort aber auch kaum erwartet.