[SQL allgemein] Abfrage- Sortierung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [SQL allgemein] Abfrage- Sortierung

    Hi...

    ich hoffe diese Abfrage lässt sich überhaupt realisieren und zwar...

    habe ich ein Gästebuch, welches ich nun erweitern möchte um Kommentareinträge. Der Kommentareintrag soll (so angedacht) in der selben Tabelle erfolgen. Dafür ist das Attribut guestcommentID vorgesehen, der als Referenz auf guestID fungieren soll. Irgendwie muß man ja auch wissen, welcher Kommentar zu welchem EIntrag gehört. Das ganze soll halt so aussehen, daß die Abfrage die Einträge erst nach dem "Haupteintrag" sortiert und dann darauf die Kommentare folgen:

    1.Eintrag
    Kommentar
    Kommentar

    2. Eintrag

    3. Eintrag
    Kommentar
    Kommentar



    Hier die Tabelle zum besseren Verständniss:

    CREATE TABLE guestbooktest (
    guestID smallint(5) unsigned NOT NULL auto_increment,
    guestdate date NOT NULL default '0000-00-00',
    guesttext varchar(250) NOT NULL default '',
    guestemail varchar(50) default NULL,
    guestauthor varchar(30) NOT NULL default '',
    guestcommentID smallint(5) unsigned NOT NULL default '0',
    gueststatus char(1) NOT NULL default '1',
    PRIMARY KEY (guestID)
    ) TYPE=MyISAM COMMENT='Gästebuch';


    Realisierbar oder nicht? *bitte*bitte*

    Danke

    Gruß
    TB

  • #2
    mach eine zweite tabelle für die kommentare und nimm die guestID da als fremdschlüssel

    dann lässt sich das wunderbarst über joins realisieren
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Re: [SQL allgemein] Abfrage- Sortierung

      Original geschrieben von tombstone7
      Hi...

      ich hoffe diese Abfrage lässt sich überhaupt realisieren und zwar...
      [...]

      CREATE TABLE guestbooktest (
      guestID smallint(5) unsigned NOT NULL auto_increment,
      guestdate date NOT NULL default '0000-00-00',
      guesttext varchar(250) NOT NULL default '',
      guestemail varchar(50) default NULL,
      guestauthor varchar(30) NOT NULL default '',
      guestcommentID smallint(5) unsigned NOT NULL default '0',
      gueststatus char(1) NOT NULL default '1',
      PRIMARY KEY (guestID)
      ) TYPE=MyISAM COMMENT='Gästebuch';


      Realisierbar oder nicht? *bitte*bitte*
      Klar geht das, aber nicht mit der Tabelle. Du brauchst, wie auch mrhappiness schrieb, eine zweite Tabelle. Also:

      1. Tabelle
      Code:
      CREATE TABLE guestbook (
        ID smallint(5) unsigned NOT NULL auto_increment,
        gbdate date NOT NULL default '0000-00-00',
        text varchar(250) NOT NULL default '',
        email varchar(50) default NULL,
        author varchar(30) NOT NULL default '',
        status char(1) NOT NULL default '1',
        PRIMARY KEY  (ID)
      ) TYPE=MyISAM COMMENT='Gästebuch';
      2. Tabelle
      Code:
      CREATE TABLE guestbookcomment (
        ID smallint(5) unsigned NOT NULL auto_increment,
        gbID smallint(5) unsigned,
        date date NOT NULL default '0000-00-00',
        comment TEXT NOT NULL default '',
        email varchar(50) default NULL,
        author varchar(30) NOT NULL default '',
        status char(1) NOT NULL default '1',
        PRIMARY KEY  (ID)
      ) TYPE=MyISAM COMMENT='Kommentare zum Gästebuch';
      Da Du MyISAM nimmst, kannst Du nicht mit ForeignKeys arbeiten (na ja, logisch schon, aber ohne Automatismus). Also musst Du das entsprechend raussuchen.

      a. Abfrage auf guestbook
      b. Ausgabe des Datensatzes
      c. gibt es in guestbookcomment einen Datensatz der Bedingung guestbookcomment.gbID = guestbook.ID erfüllt? Wenn ja, auslesen und ausgeben.
      d. wieder oben anfangen, bis nichts mehr zu holen ist oder ein Zähler überläuft oder so... naja, das wirst Du schon selber wissen.

      Alle Klarheiten beseitigt?
      Christoph

      EDIT:
      code-tags by Abraxax
      Zuletzt geändert von Abraxax; 26.08.2003, 20:28.
      Ich denke, also bin ich.
      Manche sind trotzdem!

      Kommentar


      • #4
        schade, daß man das nicht direkt in einer Tabelle lösen kann....

        ok...wie sieht dann die Abfrage aus? Mit den Joins hab ich es noch nicht so

        Gruß

        Kommentar


        • #5
          klar kannst du das auslesen dann auch problemlos mittels JOIN lösen.

          das ist sogar einfacher als viele weitere abfragen pro gb-eintrag zu machen.

          EDIT:
          Code:
          CREATE TABLE guestbook (
            gbID smallint(5) unsigned NOT NULL auto_increment,
            gbdate date NOT NULL default '0000-00-00',
            text varchar(250) NOT NULL default '',
            email varchar(50) default NULL,
            author varchar(30) NOT NULL default '',
            status char(1) NOT NULL default '1',
            PRIMARY KEY  (ID)
          ) TYPE=MyISAM COMMENT='Gästebuch';
          
          CREATE TABLE guestbookcomment (
            ID smallint(5) unsigned NOT NULL auto_increment,
            gbID smallint(5) unsigned,
            date date NOT NULL default '0000-00-00',
            comment TEXT NOT NULL default '',
            email varchar(50) default NULL,
            author varchar(30) NOT NULL default '',
            status char(1) NOT NULL default '1',
            PRIMARY KEY  (ID)
          ) TYPE=MyISAM COMMENT='Kommentare zum Gästebuch';
          Code:
          SELECT
              *
          FROM
              guestbook G
                  LEFT JOIN guestbookcomment C USING(gbID)

          Zuletzt geändert von Abraxax; 26.08.2003, 20:30.
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            Code:
            SELECT
              e.eintrag_id, e.eintrag, k.kommentar_id, k.kommentar
            FROM
              eintragtabelle e
              LEFT OUTER JOIN kommentartabelle k USING (eintrag_id)
            ORDER BY e.datum DESC, k.datum DESC
            voraussetzung:
            primary keyin eintragtabelle: eintrag_id
            foreignkey in kommentartabelle: eintrag_id

            in beiden tabellen ne spalte datum die das erstellungsdatum beinhaltet
            EDIT:
            @Abraxax
            nich hauen bitte

            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              Original geschrieben von mrhappiness
              EDIT:
              @Abraxax
              nich hauen bitte

              OffTopic:
              nö. habs auch grad gepostet..
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                ok...funktioniert teilweise... schon mal schön

                jetzt habe ich nur folgende Probleme:
                1. wie erkenne ich nun bei der Abfrage jedes Datensatzes, ob es sich um ein Kommentar handelt? der soll nämlich eingerückt werden.

                2. hatte im Vorfeld schon mal mit einer Tabelle gebastelt, welche komplett als Kommentar-Tabelle fungieren sollte..mittels eurer Hilfe klappt das ja auch soweit. nur kann ich dem USING (guestID) irgendwie klar machen, daß der Fremdschluessel nicht so heißt wie der Primärschlüssel aus der Guestbook-Tabelle?

                refID (in KommentarTabelle) ---> Referenz auf guestID (im GB)

                will in der KommentarTabelle noch Kommentare zu Events oder News speichern, daher sollte das alles allgemein gehalten werden.

                Gruß
                T

                Kommentar


                • #9
                  zu 1. du musst prüfen, ob die hauptid sich ändern.

                  zu 2. entweder du bennenst die spalte bei den kommentaren passend um, was sinnvoller ist, da du dadurch genau weisst, welche spalten wie zusammengehören ....

                  oder du verwendest ON.

                  Code:
                  SELECT
                      *
                  FROM
                      guestbook G
                          LEFT JOIN guestbookcomment C ON (G.guestID = C.refID)
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    zu 1.) meinst du mit HauptID die guestID? oder versteh ich da jetzt was falsch? experimentiere gerade mit der IF-Abfrage, aber führt immer zum falschen Ergebnis. Hier ein Bsp:

                    PHP-Code:
                    IF (!$row["comments.refID"]==$row["guestbook.guestID"])
                         
                    // Haupt-Gästebuch-Eintrag - Formatierung
                    ELSE
                        
                    // Kommentar-Eintrag - Formatierung 
                    zu 2.) meine Güte. Da wär ich im Leben nicht drauf gekommen. An dieser Stelle muß einfach ein *herzliches Dankeschön* gesagt werden. Super. Da hätt ich noch Wochen dranngesessen und hätte es wahrscheinlich immer noch nicht... dann funktioniert das auch schonmal so wie ich es gerne hätte. fehlt nur noch Punkt 1. aber da fehlt mir jetzt die denkerische Ader zu später Stunde. *Zzzzzz*

                    Danke nochmals....
                    GRuß

                    Kommentar


                    • #11
                      ja. ich meine mit der haupt-id die id der guestbook-tabelle.

                      und was deine ausgabe betrifft, so musst du erst einmal einen temp-var haben. wenn du im forum mal suchst, findest du auch beispiele. ich will jetzt nicht noch einmal das machen, was eh schon über die suche gefunden werden kann..
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar


                      • #12
                        das mit left outer , left, right, etc joins habe ich noch nie verstanden, nicht hier und nicht in irgendwelchen anleitungen.

                        kann mir das einer mal versuchen einfach zu erklären ?
                        thx Mukraker

                        Kommentar


                        • #13
                          @mukraker
                          suche mal im forum. da wurde das kürzlich erst beschrieben....
                          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                          Kommentar


                          • #14
                            @tombstone7
                            unterscheiden ob es ein gästebucheintrag oder ein kommentar is, is übelst einfach, da dir das select zwei spalten liefert, einer für gb-eintrag, eine für kommentar und du weißt ja wohl welche du abfragst *g*

                            was etwas komplizierter ist, ist festzustellen ob ein datensatz zum ersten eintrag gehört oder ob es der zweite eintrag in deinem gästebuch ist
                            PHP-Code:
                            $result=mysql_query('die abfrage');
                            $oldid=-454874;
                            while (
                            $row mysql_fetch_assoc($result))
                            {
                              if (
                            $row['guestid'] != $oldid)
                              {
                                 
                            $oldid=$row['guestid'];
                                 
                            //Eintrag im Gästebuch: ausgeben
                              
                            }
                               
                            //Hier stehen die Kommentare: ausgeben

                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              hi,

                              danke, daß klappt alles nun wunderbar, aber ein kleines Problemche mit der Abfrage existiert noch...

                              PHP-Code:
                              $query="SELECT g.*, c.* FROM guestbooktest AS g 
                              LEFT OUTER JOIN comments AS c ON (g.guestID = c.refID)
                              WHERE g.gueststatus=1 AND c.commentstatus=1 AND c.ref='
                              $content'
                              ORDER BY g.guestdate DESC, c.commentdate ASC"

                              nun ist das Problem, daß er nur die Gästebuch-Einträge und Kommentare ausgibt, die auch welche haben. Das kommt wohl wegen (AND c.commentstatus=1 AND c.ref='$content').

                              Gibt es da eine elegante Möglichkeit, wie er auch die anderen (nicht kommentierten) GB-Einträge anzeigt mit den status-Feldern?

                              Gruß
                              T
                              Zuletzt geändert von tombstone7; 28.08.2003, 16:55.

                              Kommentar

                              Lädt...
                              X