Alle Postings & Kommentare in einem Query ausgeben

  • Hallo Leute,

    habe hier noch eine Frage zu SQL Querys wo ich leider nichtmal einen Lösungsansatz hätte ...

    Ich habe folgendes Problem:

    Ich habe eine Tabelle mit Postings und eine mit Antworten (Kommentaren)

    Ich möchte diese wie folgt abfragen:

    -Posting 1
    -- Kommentar 1.1
    -- Kommentar 1.2
    -Posting 2
    -Posting 3
    -- Kommentar 3.1
    -Posting 4
    -- Kommentar 4.1
    -- Kommentar 4.2

    und das ganze möchte ich in einem Query haben ...

    normalerweise sieht bei mir eine Abfrage so aus:

    PHP
    $result = mysql_query("SELECT * FROM ....");
    while($row = mysql_fetch_array($result))
    {
      // irgendwas machen
    }

    Meine Frage ist jetzt wie so eine Abfrage und eine weiterverarbeitung in php aussehen müsste

    lg
    mathias

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Joins sind mir schon bekannt, aber wie muss die verarbeitung in php dazu aussehen ?

    dazu bräuchte ich ja theoretisch zwei schleifen ineinander und ich hab echt keinen plan wie das trotz der joins aussehen kann :confused:

    weil es können bei einem posting ja zB 10 kommentare sein und beim nächsten nur 2 ... ist ungefähr klar wie ich das mein ?

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • bastel dir doch mal einen funktionierenden query.
    Dann gibst du das ergebnis mal per var_dump aus und schaust, was dir dazu einfällt.
    Sollte dir nix einfallen => Ausgabe posten und wir überlegen mal zusammen :)

    synaptic: Einen weiteren Query sollte ersich sparen.
    Zwar ist das für den konreten Fall erstemal wurscht, aber allgemein gilt: sowenig querys wie möglich.
    Denn die sind der Performance Flaschenhals einer jeden Anwendung


  • Ja das will ich eben vermeiden, habe von hausaus schon fast 5-6 querys / seite, deswegen will ichs niedrig halten.

    Zu der Sache mit dem Query: das ist das Problem, ich habe nicht die geringste Idee zur Lösung des Problems ... deswegen bringt mir var_dump auch nix ... weil ein einfacher select query mit nem join is ja kein problem, aber was mach ich weiter damit ?

    PHP
    if(isset($this) || !isset($this)){ // that's the question...

    Einmal editiert, zuletzt von Teron Gerofied (15. Dezember 2010 um 13:11)

  • ging ja nur darum ihm das ganze etwas übersichtlicher zu gestalten... außerdem kann doch mysql nicht direkt ne query auf nen result abfeuern (soweit ich mich entsinne) und ich glaub auch derzeit nicht, dass der overhead von nem view so immens ist, dass es da so sehr ins gewicht fällt

    teron du kannst auch das ergebnis vom join in ein assoziatives array stopfen und dad so oft durchlaufen wie du magst..
    mach dir mal grundgedanken, schau dir das ergebnis an und stell konkrete fragen, wir sind hier ja net um deine anwendung zu entwickeln!

  • na gut ich hätte da schon eine idee ...

    ich mach einfach ne normale schleife von den postings und stopf alle kommentare die je geschrieben wurden in ein eigenes array und bastel das dann im php code zusammen ... das ist zwar nur ein select mehr ... aber ich hab dabei irgendwie angst, dass das soviel meiner performance frisst ... was würdet ihr dazu sagen ?

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • also was denn nun, kriegst dus hin dir den query (select mit nem Join) zu basteln oder nicht?
    Wenn ja: den mal ausführen und das Ergebnis per var_dump() ausgeben.
    Wenn nein: Warum sagst dus dann?
    Ich kann dir grad schwer folgen...


  • So ich hab jetzt mal eben so ein var_dump erstellt ...

    So solls aussehen:

    - Posting 1
    --- Kommentar 1
    --- Kommentar 2
    - Posting 2
    --- Kommentar 1
    --- Kommentar 2
    --- Kommentar 3
    - Posting 3
    --- Kommentar 1

    So siehts aus, wenn der Query so aussieht:

    SQL
    SELECT * FROM posting JOIN comment ON posting_id = com_posting_id
    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • ach komm, das kannst du ;)

    Code
    posting-array erstellen
    foreach (dbergebnisse as ergebnis)
    [INDENT]if (postingId in postingArray )
    [INDENT]neuen kommentar dem posting in postingarray zufügen
    [/INDENT]else
    [INDENT]posting dem posting-array zufügen
    kommentar dem posting in posting-array zufügen
    [/INDENT][/INDENT]Ende


  • Ich würde das ganze über zwei Querys lösen (bzw. bei Nutzung von mysqli oo (o.ä.) noch komfortabler dank prepared statements, aber du nutzt ja noch mysql_*, richtig?).
    Erstes Query liest du Postings aus und füllt sie in einen Array.
    Zweites Query liest dann die Antworten aus und ergänzt das erstellte Posting-Array um die Antworten.

    Wenn man das in einem Query per Join löst bläht man meiner Meinung nach nur das Ergebnis unnötig auf. In der Ergebnismenge sind ja zwangsläufig immer entweder die Spalten aus der Antworttabelle leer, oder die Spalten aus der Postingtabelle sind doppelt-, drei, ... zig-facher Content. Da nehme ich lieber ein Query mehr in Kauf und halbiere dafür den Speicherbedarf für meine Ergebnismenge(n).

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Ich würde das ganze über zwei Querys lösen (bzw. bei Nutzung von mysqli oo (o.ä.) noch komfortabler dank prepared statements, aber du nutzt ja noch mysql_*, richtig?).
    Erstes Query liest du Postings aus und füllt sie in einen Array.
    Zweites Query liest dann die Antworten aus und ergänzt das erstellte Posting-Array um die Antworten.

    Wenn man das in einem Query per Join löst bläht man meiner Meinung nach nur das Ergebnis unnötig auf. In der Ergebnismenge sind ja zwangsläufig immer entweder die Spalten aus der Antworttabelle leer, oder die Spalten aus der Postingtabelle sind doppelt-, drei, ... zig-facher Content. Da nehme ich lieber ein Query mehr in Kauf und halbiere dafür den Speicherbedarf für meine Ergebnismenge(n).



    So hatte ich mir das auch gedacht ;)

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • hach, offtopic ist was schönes :)
    Meiner Erfahrung nach ist heutzutage der Speicherverbrauch deutlich weniger wichtig als die Geschwindigkeit der Anwendung.
    Speicher kostet einfach nichts mehr.
    Aber für den Threadersteller sollte das letztendlich sehr egal sein. Ihn wird weder der Speicherbedarf noch der minimale Geschwindigkeitsunterschied bei diesem Problem interessieren.


  • hach, offtopic ist was schönes :)
    Meiner Erfahrung nach ist heutzutage der Speicherverbrauch deutlich weniger wichtig als die Geschwindigkeit der Anwendung.
    Speicher kostet einfach nichts mehr.
    Aber für den Threadersteller sollte das letztendlich sehr egal sein. Ihn wird weder der Speicherbedarf noch der minimale Geschwindigkeitsunterschied bei diesem Problem interessieren.


    Hab mir jetzt mal deinen Lösungsvorschlag angeschaut, stehe aber grade ein bisschen an ...

    sollte das so aussehen:

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • naja, fast:


  • ok, wenn ich das probier und $postings mit var_dump ausgebe kommt folgendes:

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • ups, peinlich, das hab ich jetzt nicht mehr geschaut ... ok meine seite raubt mir einfach derzeit dezent den schlaf und nach 2 tagen dauercodierung war ich auch schon sehr übermüdet :D

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Ok, habe jetzt die Lösung des Problems:

    Der Fehler war, dass beim immer das erste Kommentar ignoriert wurde weil das ja schon im ersten Posting steckt ... folgendes behebt den Fehler:



    EDIT: Jetzt wäre nur mehr eine Frage: Kann man mit SQL auch die Abfrage-Ergebnisse von einem JOIN limitieren, dass zB immer nur 2 Kommentare angezeigt werden .... ohne einer WHERE ... IN Anweisung ... unterstützt mein server nicht ...

    Möchte das nicht in PHP machen, weil ich sonst unnötig viele Daten aus der DB ziehe

    PHP
    if(isset($this) || !isset($this)){ // that's the question...

    4 Mal editiert, zuletzt von Teron Gerofied (16. Dezember 2010 um 15:53)