Mehrere Beiträge in abhängigkeit voneinander abhol

en…

hallo Experten,

ich grüble gerade, wie ich das wohl möglichst performant hinbekommen könnte…

Folgendes Szenario: Ich will ein Nachrichtensystem entwickeln, bei dem jeder User einstellen kann wieviele der vorhergehenden Mails er sehen will…
Dazu speichere ich in jeden neuen Eintrag der Tabelle die id des vorhergehenden Beitrags…
Nun könnte ich das rekursiv lösen…
Aber gibts da nicht einen eleganteren Weg über ein left join oder so?
Aber wie bekomme ich dann auch die richtige reihenfolge hin und was ist, wenn der User z.B. 5 eingestellt hat, es aber nur 3 gibt?

Vielen Dank für alle Denkanstösse
Grüsse
Munich

arbeitest du mit php & sql?

dann würde ich den timestamp mitspeichern
und dann "…ORDER BY time DESC LIMIT ".$anzahl;…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

arbeitest du mit php & sql?

ja…

dann würde ich den timestamp mitspeichern
und dann "…ORDER BY time DESC LIMIT ".$anzahl;…

hmmmm gute Idee…
nen TS hab ich auch schon drin aber naja - ich hab jetzt 2 weitergehende Ideen…

  1. die reply-id ist immer die auf den ausgangsbeitrag bezogen - dann kann ich alle selektieren und nur die mit der höchsten zeit ausgeben.
    Problem dabei: Es können auch mal mehrere Antworten auf eine Mail da stehen also dass aus 1 mail 2 werden…
    Also geht das so nicht

  2. das select where muss ich irgendwie austüfteln und dadurch alle betroffenen Id’s selektieren und dann mit timestamp sortieren - geht aber auch nicht so recht, weil ich den Status der mail speichern will und bei nem update den timestamp updaten würde - ok ich kann timestamp=timestamp machen aber naja… unschön *find*
    Und hilft mir noch nicht so ganz weiter, wie ich nun die betreffenden Beiträge rausbekomme, die ich haben will…

Danke aber schonmal…

Hallo

Problem dabei: Es können auch mal mehrere Antworten auf eine
Mail da stehen also dass aus 1 mail 2 werden…
Also geht das so nicht

Sehe ich das richtig, dass du eine Art Baumstruktur entstehen lassen willst, wobei der Baum nach einer vorher eingestellten Anzahl abbricht? Dann musst du bedenken, dass wenn du mitten in einem Ast abbrichst, auf der nächsten Seite der Pfad dahin irgendwie wieder auftauchen muss. Wie willst du sonnst den Rest des Astes darstellen?

  1. das select where muss ich irgendwie austüfteln und dadurch
    alle betroffenen Id’s selektieren und dann mit timestamp
    sortieren - geht aber auch nicht so recht, weil ich den Status
    der mail speichern will und bei nem update den timestamp
    updaten würde - ok ich kann timestamp=timestamp machen aber
    naja… unschön *find*

Nimm halt nicht timestamp, sondern datetime

Johannes Matschke

huhu

Problem dabei: Es können auch mal mehrere Antworten auf eine
Mail da stehen also dass aus 1 mail 2 werden…
Also geht das so nicht

Sehe ich das richtig, dass du eine Art Baumstruktur entstehen
lassen willst, wobei der Baum nach einer vorher eingestellten
Anzahl abbricht? Dann musst du bedenken, dass wenn du mitten
in einem Ast abbrichst, auf der nächsten Seite der Pfad dahin
irgendwie wieder auftauchen muss. Wie willst du sonnst den
Rest des Astes darstellen?

nö…
es ist vielmehr so, dass ich das „Blatt“ des Baums anzeige und dazu die Äste, an denen das Blatt hängt bis hin zum Stamm - aber keine weiteren Äste, die unbeteiligt sind…

  1. das select where muss ich irgendwie austüfteln und dadurch
    alle betroffenen Id’s selektieren und dann mit timestamp
    sortieren - geht aber auch nicht so recht, weil ich den Status
    der mail speichern will und bei nem update den timestamp
    updaten würde - ok ich kann timestamp=timestamp machen aber
    naja… unschön *find*

Nimm halt nicht timestamp, sondern datetime

hmmm… muss ich mal recherchieren, das datetime macht…

Danke Dir schon mal
Munich

huhu

Problem dabei: Es können auch mal mehrere Antworten auf eine
Mail da stehen also dass aus 1 mail 2 werden…
Also geht das so nicht

Sehe ich das richtig, dass du eine Art Baumstruktur entstehen
lassen willst, wobei der Baum nach einer vorher eingestellten
Anzahl abbricht? Dann musst du bedenken, dass wenn du mitten
in einem Ast abbrichst, auf der nächsten Seite der Pfad dahin
irgendwie wieder auftauchen muss. Wie willst du sonnst den
Rest des Astes darstellen?

nö…
es ist vielmehr so, dass ich das „Blatt“ des Baums anzeige und
dazu die Äste, an denen das Blatt hängt bis hin zum Stamm -
aber keine weiteren Äste, die unbeteiligt sind…

Dann musst du mir noch mal erklären, auf was sich die Anzahl bezieht. Auf Blätter am selben Zweig oder auf völlig unabhängige Blätter?

mal gucken ob ich das hier darstellen kann…

|-Nachricht 1
 |-Nachricht 2
 |-Nachricht 3
 |-Nachricht 4
 |-Nachricht 5
 |-Nachricht 6
|-Nachricht 7

also… alles was eingerückt ist wurde später geantwortet…
wenn nun auf Nachricht 5 geantwortet wird sollen die oberen Ebenen „zitiert“ werden…
d.h. es werden 4, 3 und 1 angezeigt.
Wenn auf Nachricht 6 geantwortet wird stehen 3 und 1 da…
sonst nischt…

war das verständlich?

hmmmm gute Idee…
nen TS hab ich auch schon drin aber naja - ich hab jetzt 2
weitergehende Ideen…

  1. die reply-id ist immer die auf den ausgangsbeitrag bezogen
  • dann kann ich alle selektieren und nur die mit der höchsten
    zeit ausgeben.
    Problem dabei: Es können auch mal mehrere Antworten auf eine
    Mail da stehen also dass aus 1 mail 2 werden…
    Also geht das so nicht
  1. das select where muss ich irgendwie austüfteln und dadurch
    alle betroffenen Id’s selektieren und dann mit timestamp
    sortieren - geht aber auch nicht so recht, weil ich den Status
    der mail speichern will und bei nem update den timestamp
    updaten würde - ok ich kann timestamp=timestamp machen aber
    naja… unschön *find*
    Und hilft mir noch nicht so ganz weiter, wie ich nun die
    betreffenden Beiträge rausbekomme, die ich haben will…

Danke aber schonmal…

versuch doch erst eine möglichst passende struktur zu finden, und dann dir um den algo gedanken zu machen

MAIL{
ID:Integer
Autor:Integer (Ref)
Text:Text
Zeit:timestamp
)

ANTWORT(
ID:Integer
Autor:Integer (Ref)
Text:Text
Zeit:timestamp
replies_to_mail:integer (Ref)
replies_to_reply:integer (Ref)
)

nur so als vorschlag

versuch doch erst eine möglichst passende struktur zu finden,
und dann dir um den algo gedanken zu machen

die Struktur hab ich schon - eine Tabelle…
Wenn
answer_for = 0 dann ist es der Beginn einer Nachrichtenkette - ansonsten halt immer eine Antwort…
Ich hab das mal in Access nachgestellt und dann in mysql migriert…
funktioniert soweit auch - nur muss ich diesen String jetzt automatisieren und dann die Ergebnisse auswerten…

SELECT nachrichten.id, nachrichten.text, nachrichten\_1.id, nachrichten\_1.text, nachrichten\_2.id, nachrichten\_2.text, nachrichten\_3.id, nachrichten\_3.text, nachrichten\_4.id, nachrichten\_4.text
FROM 
 (
 (
 (
 nachrichten
 LEFT JOIN nachrichten AS nachrichten\_1 ON nachrichten.answer\_for = nachrichten\_1.id
 )
 LEFT JOIN nachrichten AS nachrichten\_2 ON nachrichten\_1.answer\_for = nachrichten\_2.id
 )
 LEFT JOIN nachrichten AS nachrichten\_3 ON nachrichten\_2.answer\_for = nachrichten\_3.id
 )
LEFT JOIN nachrichten AS nachrichten\_4 ON nachrichten\_3.answer\_for = nachrichten\_4.id 

naja - und das muss ich dazu jetzt erst mal kapieren *grins*

mal gucken ob ich das hier darstellen kann…

|-Nachricht 1
 |-Nachricht 2
 |-Nachricht 3
 |-Nachricht 4
 |-Nachricht 5
 |-Nachricht 6
|-Nachricht 7

also… alles was eingerückt ist wurde später geantwortet…
wenn nun auf Nachricht 5 geantwortet wird sollen die oberen
Ebenen „zitiert“ werden…
d.h. es werden 4, 3 und 1 angezeigt.
Wenn auf Nachricht 6 geantwortet wird stehen 3 und 1 da…
sonst nischt…

war das verständlich?

ja…
aber was meinst du mit

Folgendes Szenario: Ich will ein Nachrichtensystem entwickeln,
bei dem jeder User einstellen kann wieviele der vorhergehenden
Mails er sehen will…

|-Nachricht 1
|-Nachricht 2
|-Nachricht 3
|-Nachricht 4
|-Nachricht 5
|-Nachricht 6
|-Nachricht 7

ja…
aber was meinst du mit

Folgendes Szenario: Ich will ein Nachrichtensystem entwickeln,
bei dem jeder User einstellen kann wieviele der vorhergehenden
Mails er sehen will…

hat sich im Prinzip eh schon erledigt, weil ich mein SQL Statement jetzt hinbekommen hab :smile:
Ich meine damit dass wenn der User eingestellt hat dass er die 2 vorhergehenden Einträge eingestellt hat und sich Nachricht 5 ansieht,. dass er denn Nachricht 3 und 4 zitiert sieht :smile:

nee, oder?
Hallo

Da finde ich es rekursiv aber wesentlich elegenater. So wie du es jetzt machen willst, ist ja der Query-String von der Anzahl der anzuzeigenden Mails abhängig. Wenn das nun 20 sind…
Außerdem müsstest du vorher in Erfahrung bringen, wie viele Mails es anzuzeigen gibt, sonst könnte es Probleme geben.
Wenn du es rekursiv machst, brauchst du nur mitzuzählen, wieviele Emails du schon hattest und brichst ab, wenn es keine Mails mehr gibt oder das Limit erreicht ist.
Was mich nur interresieren würde ist, ob das Rekursive von MySQL erledigt werden kann.

Johannes Matschke

Hallo

auf was bezog sich das „nee, oder?“?

durch dieses left join auf die eigene Tabelle bezogen wird es rekursiv - aber eben nur auf eine Ebene beschränkt - wenn nichts gefunden wird, dann wird in dem Feld NULL ausgegeben.
In meinem Script checke ich den wert mit if(is_null(…)) und breche dann aus…
(nicht im SQL-Part)
Der Querystring ist in der Tat von der Anzahl der Ebenen abhängig. Er wird aber in der praxis maximal 5 Ebenen tief werden denke ich. Mehr wird da nicht gebraucht.

Bei einer rekursiven Lösung bräuchte ich dann auch mehrere SQL Abfragen - und darauf möchte ich eigentlich verzichten… :smile:

Greetz
Munich

Hallo

auf was bezog sich das „nee, oder?“?

Mir ist dieser lange Query-String etwas unsympatisch. Aber es hat natürlich auch vorteile, nur eine Abfrage durchführen zu müssen.

durch dieses left join auf die eigene Tabelle bezogen wird es
rekursiv - aber eben nur auf eine Ebene beschränkt - wenn
nichts gefunden wird, dann wird in dem Feld NULL ausgegeben.

Gibts in MySQL nicht was einfaches wie

SELECT \* FROM tabelle1 WHERE id=answer\_for

, damit sich da ein Baum aufbaut? Ich kann in MySQL eben nur die Standardabfrage. Nicht mal LEFT JOIN behersche ich (Ist für Join mit zwei Tabellen auch nicht nötig, aber du hast ja eine Tabelle).

Johannes Matschke