[MySQL] Spalten einer Zeile mit dem höchsten Spaltenwert joinen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [MySQL] Spalten einer Zeile mit dem höchsten Spaltenwert joinen

    Morgen.

    Mit diesem Query bekomme ich alle Themenzeilen mit der Anzahl der Beiträge geliefert.

    SQL-Abfrage

    1. SELECT `id`, `title`,
    2. (SELECT COUNT(*) FROM `sj_posts` WHERE `sub`=`sj_topics`.id) AS `count_posts`
    3. FROM `sj_topics` WHERE `sub`=7


    Jetzt würde ich gerne noch wissen, wie ich die Spalten `autor_id` und `time` der Tabelle
    sj_posts dazujoine aus der jeweiligen zeile mit dem höchsten time-Wert.
    Das ist doch sicher möglich.

    thx
  • Infperformant und sicherlich funktionierend kannst du es mit Subselects machen (2 Subselects pro Ergebnis)

    Quellcode

    1. SELECT `id`, `title`,
    2. (SELECT COUNT(*) FROM `sj_posts` WHERE `sub`=`sj_topics`.id) AS `count_posts`,
    3. (SELECT autor_id FROM `sj_posts` WHERE `sub`=`sj_topics`.id ORDER BY time DESC LIMIT 1) AS last_autor,
    4. (SELECT time FROM `sj_posts` WHERE `sub`=`sj_topics`.id ORDER BY time DESC LIMIT 1) AS last_time
    5. FROM `sj_topics`


    Was aber bestimmt schöner wäre, ist ein JOIN auf einen Subselect (in dem Fall würde dieser nur einmal gemacht werden)
    Probiers mal so... ist nur frei formuliert...

    Quellcode

    1. SELECT `id`, `title`,
    2. (SELECT COUNT(*) FROM `sj_posts` WHERE `sub`=`sj_topics`.id) AS `count_posts`
    3. FROM `sj_topics`
    4. NATURAL JOIN
    5. (SELECT sub AS id, autor_id, MAX (time) AS time FROM sj_posts GROUP BY sub)
  • Hi,
    #1248 - Every derived table must have its own alias

    alias ist der Name, den wir immer mit AS vergeben. Füge einfach mal ein ...sj_posts GROUP BY sub) AS x hinten an. Könnte dann schon funktionieren.

    Um zu verstehen was überhaupt passiert, mach den letzten Subselect mal Einzeln.
    Das sind quasi zwei Tabellen die geJOINed werden. Von sub in id habe ich die Tabelle gealiast, damit man einen NATURAL JOIN machen kann.

    Falls das funktioniert habe ich einen weiter optimierten Query für dich....

    Quellcode

    1. SELECT id,
    2. title,
    3. COUNT(*) AS count_posts
    4. FROM sj_topics t
    5. JOIN sj_posts p
    6. ON p.sub = t.id
    7. NATURAL JOIN (
    8. SELECT sub AS id,
    9. autor_id,
    10. MAX (time) AS time
    11. FROM sj_posts
    12. GROUP BY sub
    13. ) AS x
    14. GROUP BY id;
    Alles anzeigen


    Nochmal in Kurzform die Änderung mit mit dem Postzähler:

    Quellcode

    1. SELECT title, COUNT(*) AS count_posts
    2. FROM sj_topics
    3. GROUP BY id;


    Um mal nachzuprüfen wie sich das Performancetechnisch auswirkt, nutze das Schlüsselwort EXPLAIN

    Quellcode

    1. EXPLAIN SELECT title, COUNT(*) AS count_posts
    2. FROM sj_topics
    3. GROUP BY id;


    Generell kann ich dir sagen, dass alle professionellen Forensysteme redundant sind um dadurch schneller zu sein. Die haben einfach einen Postzähler in der Spalte.
  • Die 'last_post_time'- und die 'last_post_autor_id'-Spalte fehlen bei der Auflistung!

    SQL-Abfrage

    1. SELECT `id`, `title`,
    2. (SELECT COUNT(*) FROM `sj_posts` WHERE `sub`=`sj_topics`.id) AS `count_posts`
    3. FROM `sj_topics`
    4. NATURAL JOIN
    5. (SELECT `sub` AS `id`, `last_post_autor_id`, MAX(`time`) AS `last_post_time` FROM `sj_posts` GROUP BY `sub`) AS x

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von sjBlack ()

  • jo. perfekt.
    aber der performantere query ist nur um etwa 0.0005 Sek. schneller. lol
    danke nochmal

    // edit
    OH VERFLUCHT!

    SQL-Abfrage

    1. SELECT `id`, `title`, `last_post_autor_id`, `last_post_time`,
    2. (SELECT COUNT(*) FROM `sj_posts` WHERE `sub`=`sj_topics`.id) AS `count_posts`
    3. FROM `sj_topics`
    4. NATURAL JOIN
    5. (SELECT `sub` AS `id`, `autor_id` AS `last_post_autor_id`, MAX(`time`) AS `last_post_time` FROM `sj_posts` GROUP BY `sub`) AS x
    6. WHERE `sub` = 7

    Das listet nicht die Themen auf, die noch keine Beiträge haben!
    Naja, egal. Das erste funktioniert eh. Darauf komme ich noch später von selbst.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von sjBlack ()