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

Unterkommentare für Kommentare?

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Naquadah, 3 August 2015.

  1. Naquadah

    Naquadah Benutzer

    Ich würde es gerne so machen, das meine Kommentare Unterkommentare haben können. Ich erstelle grade einen kompletten Blog, um meine Fähigkeiten in Sachen MySQL und auch in der Programmierung zu verbessern.

    "Normale" Kommentare sind jetzt schon für die Blog Einträge mögich aber wie kriege ich es hin, das ein Kommentar auch so Unterkommentare haben kann, also auch mehrere?
    Derzeit sieht meine Tabelle für ein Kommentar so aus:

    Kommentar.png

    Die Ansicht reicht ja oder? Ich habe das jetzt mal aus phpmyadmin kopiert.

    Brauche ich dann dafür noch eine extra Tabelle "Unterkommentar", die dann durch eine Referenz in dem Kommentar dem Unterkomemntar zugeordnet wird? Man brauch ja dann auch eigentlich keine Referenz auf die Tabelle für den Eintrag oder? Man kann die dann ja durch die Referenz dann zuordnen?
     
  2. Distrilec

    Distrilec Datenbank-Guru

    Wie wäre es mit einem rekursivem Verweis ?
    Das Unterkommentar ist einfach nur ein Kommentar in deiner Tabelle, verweist allerdings auf eine ID des übergeordneten Kommentars?

    Natürlich müsste man wissen wie dein restliches Design soweit aussieht (vorallem worauf die Spalte entry_id verweist) aber grundsätzlich möglich...
     
  3. Naquadah

    Naquadah Benutzer

    Wie macht man das denn mit einem rekursivem Verweis? Ich wusste gar nicht, dass das auch in MySQL geht. Allerdings müsste ich dann ja auch noch die Struktur des Kommentars um ein Feld erweitern, sonst würde das ja nicht funktionieren, nicht wahr?

    Wieso muss man dafür jetzt unbedingt die Struktur des Eintrages kennen? Ich kann ja hier gerne mal die Tabelle zeigen.:
    Eintrag.png
     
    Zuletzt bearbeitet: 3 August 2015
  4. akretschmer

    akretschmer Datenbank-Guru

    vereinfacht so:

    Code:
    test=# create table kommentare (id serial primary key, parent_id int references kommentare, content text);
    CREATE TABLE
    
    Zum Abfragen nutzt man dann rekursive Abfragen. Allerdings kann MySQL das, wie so vieles, nicht.
     
  5. ukulele

    ukulele Datenbank-Guru

    Wenn du nur zwei Kommentar-Ebenen hast würde ich dir zu einer eigenen Tabelle für Unterkommentare raten. Ansonsten zu einer anderen Datenbank.
     
  6. Naquadah

    Naquadah Benutzer

    @akretschmer
    Ist das da oben auch MySQL Syntax? Das mit =# habe ich noch nie gesehen oder wofür soll das stehen? Wenn das dann aber eh nicht mit MySQL abgefragt werden kann, dann macht das doch auch keinen Sinn oder nicht? Mir fällt da aber auch keine Möglichkeit ein, wie man das mit einer SQL Abfrage vergleichen kann. Joins kann man ja auch nicht verwenden und mit einer einfachen WHERE Abfrage geht das ja auch nicht?

    Wenn ich nur ein Unterkommentar erlauben wollen würde, dann würde ich das ja auch warscheinlich mit einer extra Tabelle machen aber ich würde ja gerne mehrere erlauben und nicht nur eines. Geht das denn dann mit MySQL überhaupt?
     
  7. Distrilec

    Distrilec Datenbank-Guru

    Kurz und Knapp? Nein...

    Zumindest nicht mit reiner Datenbankfunktionalität... Man kann sich natürlich was mit PHP oderso zusammen frickeln...
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Ich arbeite mit psql, dem CLI-Tool von PostgreSQL. 'test' ist der Name der DB, =# zeigt an, daß ich in keiner Transaktion bin. Dann hätte ich =*#.

    Du verwendest MySQL. Das ist dazu (zu PostgreSQL) im Vergleich ein primitives Spielzeug.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Ach ja, um rekursive Abfragen (mit PostgreSQL) mal wenigstens kurz gezeigt zu haben:

    Code:
    test=*# select * from kommentare ;
     id | parent |  content
    ----+--------+--------------------------
      1 |  | erster haupt
      2 |  1 | erster unter
      3 |  2 | erster unter unter
      4 |  3 | erster unter unter unter
      5 |  | zweiter
    (5 rows)
    
    Time: 0,167 ms
    test=*# with recursive r as (
      select *,
      0::int as level
      from kommentare
      where parent is null
    
      union all
    
      select  kommentare.*,
      r.level+1
      from kommentare
      inner join r on kommentare.parent=r.id
    )
    
    select  id,
      parent,
      repeat('-',level) || '> ' || content
    from r
    order by id, parent;
     id | parent |  ?column?
    ----+--------+-------------------------------
      1 |  | > erster haupt
      2 |  1 | -> erster unter
      3 |  2 | --> erster unter unter
      4 |  3 | ---> erster unter unter unter
      5 |  | > zweiter
    (5 rows)
    
    
     

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