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…
-
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
-
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?
- 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…
- 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…
- 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
- 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 
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 
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… 
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