multi selects

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

  • multi selects

    hi..

    ich versuche 3 select hintereinander abzufragen.
    das klappt so leider wie gewünscht nicht wie ich es mir vorstelle.
    2 selects gehen problemlos.
    folgendes.
    bastel gerad daran mir ein kleines forum zu bauen.

    bei meiner sql abfrage ist das so, das ich themen zu jener kategorie sowohl als auch die beiträge gezählt auslesen will.
    alles bis hin zum zähler für die themen klappt.
    aber dem zeitpunkt wo ich auslese wieviel beiträge es dann sind, scheitert es indem er mir jedes mal den gleichen wert zu weißt, obwohl in einer von drei kategorien nur die themen sind. die anzahl ließt er korrekt aus. nur weißt er jedes mal den anderen kategorien den gleichen wert zu.
    das ganze ist mal wieder smartygerecht..

    so sieht sie aus:

    PHP-Code:

    $forum 
    $tdDB->getAll('select id,catid,titlecat,subtitlecat, 
                           
    (select count(refid) from ! where refid=refid) as beitraege,
                                                        (select count(forumcat) from ! where forumcat=catid) as forum from ! '

                            
    array( 
    FORUM_THEMA_TABLE,FORUM_THEMA_TABLE,FORUM_TABLE ) );

    $t->assign('forum'$forum); 
    und das steht im .tpl was aber eigendlich unwichtig sein dürfte...
    habs mich hier nur auf die ausgaben beschränkt statt den restlichn html code

    HTML-Code:
    {foreach item=item key=key from=$forum}
    titel: {$item.titlecat}
    subtitel: {$item.subtitlecat}
    anzahl themen: {$item.forum}
    
    anzahl beiträge {$item.beitraege}
    {/foreach}
    So, nun das hier steht in der db.

    3 kategorien (cat)

    cat 1 = 1 thema + 2 beiträge
    cat 2 = 0 themen
    cat 3 = 0 themen

    folgende ausgabe findet statt:

    cat 1 = 1 thema beiträge:2
    cat 2 = 0 themen beiträge:2
    cat 3 = 0 themen beiträge:2

    hoffentlich ist das so verständlich genug geschrieben..

    ich komme jedenfalls so nicht weiter.
    woran liegt das, das er den gezählten wert bei jedem schleifendurchgang
    auf genau den gleichen wert setzt. macht er ja schließlich beim zählen der themen auch nicht..

    vielen danke schonmal
    Zuletzt geändert von chrissi11; 05.03.2010, 20:01.

  • #2
    Was ergibt denn ein print_r($forum);? Vielleicht ist ja die Abfrage falsch.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      hi, das kommt dabei raus:

      Code:
      Array ( 
      [0] => Array ( 
      [id] => 1 
      [catid] => 1 
      [titlecat] => testkategorie 
      [subtitlecat] => das ist die kategorie zum testen 
      [beitraege] => 2 
      [forum] => 1 ) 
      [1] => 
      
      
      
      Array ( 
      [id] => 2 
      [catid] => 2 
      [titlecat] => autos 
      [subtitlecat] => alles rund um autos 
      [beitraege] => 2 
      [forum] => 0 ) 
      
      [2] => 
      
      Array ( [id] => 3 
      
      [catid] => 3 
      [titlecat] => spiele 
      [subtitlecat] => neueste spiele online usw 
      [beitraege] => 2 
      [forum] => 0 ) )
      er sagt immer beiträge 2..und das ist falsch

      edit: forum ist der wert für die anzahl der themen..
      Zuletzt geändert von chrissi11; 05.03.2010, 17:52.

      Kommentar


      • #4
        Gib mal den Query zum Beispiel in PHPMyAdmin ein und schau, was dabei herauskommt. Und was macht die Methode getAll?

        Peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          so, der befehl in mysql

          SELECT id, catid, titlecat, subtitlecat, (

          SELECT count( refid )
          FROM `chat_forum_thema`
          WHERE refid = refid
          ) AS beitraege, (

          SELECT count( forumcat )
          FROM `chat_forum_thema`
          WHERE forumcat = catid
          ) AS forum
          FROM `chat_forum`
          LIMIT 0 , 30

          folgendes ergebnis:

          id catid titlecat beitraege forum
          1 1 testkategorie 2 1
          2 2 autos 2 0
          3 3 spiele 2 0

          ich hab mal übersichtshalber subtitles rausgenommen..
          ergebnis ist so nicht richtig.
          in meinem script muss wad falsch sein..nur was mach ich da falsch *denk

          die methode:
          getAll bestimmt das alle werte nutzbar sind.
          getOne in meinen fall bestimmt nur einen wert.
          Zuletzt geändert von chrissi11; 05.03.2010, 18:22.

          Kommentar


          • #6
            Code:
            SELECT count( refid )
            FROM `chat_forum_thema`
            WHERE refid = refid
            Ist Tinnef. Schau dir mal das Thema SELF JOIN an und erstelle eine vernünftige Beziehung. Und dafür brauchst du nicht mal Subselects. Außerdem sollest du dich mit Normalisierung beschäftigen, dann umgehst du solche Probleme.

            Peter

            PS. Da dies mittlerweile ein reines SQL-Problem ist, verschieb ich das mal ins richtige Forum.
            Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
            Meine Seite

            Kommentar


            • #7
              oha, das soll einer verstehen..wie kompliziert ist das denn? gibts da keinen besseren weg?

              edit: naja, danke erstmal..werd ich mir das wohl oder über mal über mich gehen lassen *krampf

              hi nochmal..ich versteh das prinzip von JOIN noch nicht so ganz. Naja.eigentlich garnicht... kann mir da jemand behilflich sein das ganze zu verstehn?
              So wie ich das nun gelesen habe gibt es mehrere joins..und ich geh davon aus das der inner join der ist, den ich brauche für meine abfrage.

              jetzt lese ich, das beim inner join "die zweite tabelle" mit an die erste verknüpft wird..aber die bedinung hab ich noch nicht durchblickt..und wie das im script nun aussehen muss ehrlich gesagt auch nicht..ich blicks nicht..

              hoffe es hilft mir jemand..danke schonmal
              Zuletzt geändert von AmicaNoctis; 07.03.2010, 12:19. Grund: Doppelpost

              Kommentar


              • #8
                Da musst du aber schon etwas konkreter werden. Ganz allgemein: Ein Join ist das, was passiert, wenn du jedes Element einer Menge mit jedem einer anderen Menge kombinierst (Kreuzprodukt). Die on-Klausel legt dabei Einschränkungen für diese Kombinationen fest.

                Beispiel: Du verkaufst Feuerzeuge, Taschenrechner und Kerzen. Das ist die erste Menge, die Menge an Dingen. Die zweite Menge besteht aus den Farben Rot, Grün und Blau. Wenn du das jetzt kombinierst, hast du 3 Dinge in je 3 verschiedenen Farben, also 9 verschiedene Produkte. Das wäre ein Cross Join. Wenn du aber keine blauen Kerzen anbieten kannst, musst du zusätzliche Bedingungen festlegen, was man mit einer on-Klausel machen könnte.

                Üblicherweise joint man in einer normalisierten DB nur über Primär- und Fremdschlüsselspalten. Das erkläre ich dir aber nicht, das liest du dir z. B. bei Wikipedia unter "Normalisierung" durch.

                Es gibt doch so viele Beispiele im Web, sogar hier im Forum. Wenn du dir die erstmal ansehen würdest und die dabei verwendeten Tabellen als Testtabellen bei dir anlegst, hast du doch eine erstklassige Spielwiese, um damit herumzuprobieren.

                Von einem Forum kannst du keinen persönlichen Lehrgang erwarten. Das was ich dir jetzt erklärt habe, hättest du auch schon selbst über Google in Erfahrung bringen können.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  hi nochmal.. okay..hab mich nun echt lange damit beschäftigt darüber zu lesen und auszuprobieren. bin noch nicht auf den richtigen trichter gekommen, bis ich diese seite entdeckt habe.

                  MySQL: Daten bearbeiten - HTMLWorld

                  jetzt kann ich schonmal anhand meinem beispiel verstehen wie das
                  funktioniert. also das zählen auf diese weise hab ich ja nun hinbekommen.
                  meine datenbank hab ich dementsprechend auch noch angepasst.

                  folgendes.. mit diesem sql befehl bekomme ich mein richtiges resultat.

                  select count(*) from chat_forum_kategorien , chat_forum_themen
                  where chat_forum_themen.cat = chat_forum_kategorien.kcatid

                  das problem: ich brauche leider noch viel mehr informationen.
                  zum einen brauch ich die werte aus der kategorie, dann die gezählten themen jener kategorie und die gezählten beiträge dieser kategorie.

                  weiterhin hab ich probiert in dieser abfrage weitere selects einzufügen.
                  aber da fängt dann sql an zu mäckern. vor allem, ich zähle ja praktisch jeden einzelnen eintrag damit, was ich aber eigentlich garnich haben will.
                  sondern nur 2 zähler und die restlichen werte die ich zum ausgeben brauche.

                  so siehts erstmal in meiner datenbank aus: 3 tabellen..

                  kategorien:

                  -id
                  -titlecat
                  -subtitlecat
                  -kcatid

                  id und kcatid sind hier immer identisch.

                  themen:
                  -id
                  -ttitle
                  -date
                  -cat
                  -autor

                  beitraege:
                  -id
                  -autor
                  -text
                  -bdate
                  -top (die thema id sozusagen)
                  -catid



                  damit zähle ich die themen aus jener kategorie.
                  aber ich komm mit dem rest immernoch nicht klar

                  Kommentar


                  • #10
                    zum einen brauch ich die werte aus der kategorie
                    Wenn du die benötigst, ist mit count Essig. Das funktioniert nicht. Die einfachste Lösung wäre, alle benötigten Daten zu ziehen und dann per PHP mit count zu arbeiten. Aber sicher haben unseren SQL-Experten dafür eine bessere Lösung. Ich habe leider seit über zwei Jahren mit komplexen SQL-Abfragen nichts mehr tun und bin da ein wenig aus dem Thema.

                    Peter

                    PS: Dafür muss ich mich um jeden größeren JavaScript-Mist kümmern.
                    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                    Meine Seite

                    Kommentar


                    • #11
                      hi, ja eben drum das ist ja das blöde..
                      mit count habe ich erstmals jetzt versucht das eine ergebnis zu zählen..
                      das klappt sofern auch.. ein zähler fehlt mir dementsprechend noch.

                      ich könnte zwar die einzelnen elemente zählen lassen,was auch nicht das problem wäre, aber wie füg ich diese ergebnisse dann wieder so ein, das ich sie für smarty brauchbar mache?

                      da ich ja mit ner foreach schleife im template die ausgaben mache und nicht mit php....na dann hoff ich mal, das sich jemand findet der mir da weiter helfen kann..

                      danke dir erstmal kroppf und amica für die aufgebrachte mühe

                      Kommentar


                      • #12
                        hi nochmal..ich hab eine lösung gefunden.. naja, sagen wir ich hatte die ganze zeit meine abfrage falsch gestaltet.
                        das mit den subselects klappt an sich ganz gut.

                        vielleicht gibts dafür eine elegantere lösung. ich weiß nicht.
                        aber so funktioniert es zumindest bei mir erstmal.
                        wie es nun mit der performance aussieht, weiß ich auch nicht.
                        ich rufe ja eigentlich immer nur einen wert ab.
                        muss das aber halt für jeden wert den ich haben will einmal machen :/

                        so schauts dann aus..

                        PHP-Code:

                        'select id,titlecat,subtitlecat,                            
                                                    
                        (select autor from ! where catid = kcatid  order by bdate desc limit 1 ) as lastautor,    
                                                    
                        (select autorname from ! where catid = kcatid order by bdate desc limit 1) as autorname,
                                                    
                        (select ttitel from ! where catid = kcatid order by bdate desc limit 1) as lastbeitrag,

                        (select top from ! where catid = kcatid order by bdate desc limit 1) as gotopic,
                                                    
                        (select count(cat) from ! where cat = kcatid) as at,            
                        (select count(top) from ! where catid = kcatid ) as ab from ! '

                        array( 
                         
                        FORUM_BEITRAEGE_TABLE,FORUM_BEITRAEGE_TABLE,
                        FORUM_BEITRAEGE_TABLE,FORUM_BEITRAEGE_TABLE,
                        FORUM_THEMEN_TABLE,FORUM_BEITRAEGE_TABLE,
                        FORUM_KATEGORIEN_TABLE  ) ); 
                        wer wsa damit anfangen kann, bittesehr
                        viele grüße
                        Zuletzt geändert von chrissi11; 11.03.2010, 14:57.

                        Kommentar

                        Lädt...
                        X