Bestimmtes Ergebnis aus der 2. Tabelle einer INNER JOIN abfrage

holmnet

Neuer Benutzer
Beiträge
2
Ich steh irgendwie komplett aufd em Schlauch und finde einfach keinen Lösungsansatz:

Ich habe eine Tabelle mit Kunden und eine Tabelle mit Kommentaren zum Kunden.

Jetzt möchte ich in einer Abfrage Kunde und den neusten Kommentar, sowie dessen Datum abfragen.

Da ich aber Kommentar und Datum abfragen will, möchte ich es ungerne mit einer verschachtelten Select abfrage lösen.

Also

SELECT
input_AusstellerVorname,
input_AusstellerName,
FROM Kundentabelle
INNER JOIN Kommentartabelle
ON Kundentabelle.ID = Kommentartabelle.KundenID
WHERE Kundentabelle.ID = 10660
LIMIT 0,20

Wie steuer ich jetz also das Ergebnis aus der Kommtartabelle, wenn es dort (logischerweise) mehrere Ergebnisse gibt?
 
Werbung:
Ich steh irgendwie komplett aufd em Schlauch und finde einfach keinen Lösungsansatz:

Ich habe eine Tabelle mit Kunden und eine Tabelle mit Kommentaren zum Kunden.

Jetzt möchte ich in einer Abfrage Kunde und den neusten Kommentar, sowie dessen Datum abfragen.


Viele Wege führen nach Rom:

Code:
test=*# select * from kunden ;
 id |  name
----+--------
  1 | kunde1
  2 | kunde2
(2 rows)

test=*# select * from kommentare ;
 kunde |  ts  |  k
-------+----------------------------+-------
  1 | 2013-12-16 12:06:30.110381 | bla
  1 | 2013-12-16 12:08:20.306653 | blubb
  2 | 2013-12-16 12:08:30.450362 | xxx
  2 | 2013-12-16 12:08:36.041971 | xxx2
(4 rows)

test=*# select kunden.name, kommentare.ts, kommentare.k from kunden left join kommentare on kunden.id=kommentare.kunde where (kommentare.kunde, kommentare.ts) in (select kunde, max(ts) as ts from kommentare group by kunde);
  name  |  ts  |  k
--------+----------------------------+-------
 kunde1 | 2013-12-16 12:08:20.306653 | blubb
 kunde2 | 2013-12-16 12:08:36.041971 | xxx2
(2 rows)
 
Ok, jetzt stehe ich neben dem Schlauch. Ich sehe zwar, dass es geht, verstehe es aber noch nicht ganz.
Die WHERE Bedingung heißt das was?

Das kunde und timestamp im ergebnis des sub-selects enthalten sein müssen?

Ich lass das mal über meine DB laufen. Mein letzter Lösungansatz dauerte 40 sekunden Response Zeit :-(
 
Werbung:
Ok, jetzt stehe ich neben dem Schlauch. Ich sehe zwar, dass es geht, verstehe es aber noch nicht ganz.
Die WHERE Bedingung heißt das was?

Das kunde und timestamp im ergebnis des sub-selects enthalten sein müssen?

Ich lass das mal über meine DB laufen. Mein letzter Lösungansatz dauerte 40 sekunden Response Zeit :-(

Genau. Wenn Deine Kommentartabelle einen PK hat, ginge es auch so:

Code:
test=*# select * from k;
 id | kunde |  k  |  ts
----+-------+------+----------------------------
  1 |  1 | bla  | 2013-12-17 08:38:36.488739
  2 |  1 | bla2 | 2013-12-17 08:38:57.231955
  3 |  2 | foo  | 2013-12-17 08:39:08.943532
  4 |  2 | foo2 | 2013-12-17 08:39:16.65522
  5 |  2 | foo3 | 2013-12-17 08:39:23.999019
(5 rows)

test=*# select distinct on (kunde) id, kunde from k order by kunde, ts desc;
 id | kunde
----+-------
  2 |  1
  5 |  2
(2 rows)

Und wenn Du die 2 letzten Kommentare haben möchtest:

Code:
test=*# select id, kunde from (select id, kunde, row_number() over (partition by kunde order by ts desc)from k) foo where row_number <= 2 order by kunde, id;
 id | kunde
----+-------
  1 |  1
  2 |  1
  4 |  2
  5 |  2
(4 rows)

Da hast dann die passenden ID's zum joinen.


Das würde aber so nicht mit MySQL gehen, das kann das und vieles mehr ja nicht.
 
Zurück
Oben