Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Bestimmtes Ergebnis aus der 2. Tabelle einer INNER JOIN abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von holmnet, 16 Dezember 2013.

  1. holmnet

    holmnet Neuer Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru


    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)
    
     
  3. holmnet

    holmnet Neuer Benutzer

    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 :-(
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden