UndSo: Query und count()

Hallo, habe eine kleine Frage.

Ich habe mir "inner join" zwei Tabellen verbunden.
In der Tabelle "usertabelle" sind alle Userid's von 0-1000 vorhanden.
In der Tabelle "flirttabelle" sind nur ein paar userids vorhanden, wenn jemand eine andere userid attraktiv findet.

Mein Problem nun:
In einem Script frage ich nun ab, ob ich diese Person schon attraktiv finde.

In der Query ist ein count drin.
Wenn nun ein Eintrag vorhanden ist, holt er auch erfolgreich die anderen Werte wie Username, Wohnort usw.
Alles Prima.

Wenn nun kein Eintrag vorhanden ist, da ja die Zeile nicht da ist, kann ich auf die anderen Sachen wie Username, Wohnort nicht zugreifen, und muss dann wieder dementsprechend eine Query verballern.
Könnte man in der einen Query das ganze nicht so machen, sobald keine Zeile in der Tabelle "flirttabelle" vorhanden ist, er dennoch die anderen Daten von der "usertabelle" holt und fpr count dann 0 ausgibt?

Die Query sieht gerade so aus:

select count(A.userid), B.username, B.wohnort from flirttabelle AS A INNER JOIN usertabelle AS B ON A.flirtid=B.id where userid=859 and flirtid=860 GROUP BY userid, username, wohnort;

Übrigens. Ich arbeite mit Mysql 4.1.10

Grüße

  1. Hallo,

    ich würde mal tippen, du benötigst einen LEFT OUTER JOIN (von Usertabelle zu Flirttabelle) und zählst die Records pro User in der Flirttabelle.

    ... etwa so ...

      
    SELECT a.Name, Count(b.userId1)  
     FROM usertabelle a  
     LEFT OUTER JOIN flirttabelle b  
      ON b.userId1 = a.ID  
     GROUP BY a.Id, a.Name, b.userId1  
    
    

    Dann bekommst du z.b. sowas

    Karl         2
    Karla         1
    Claudio         1
    Claudia         0
    Dani         3
    Patrick         0
    Patrizia 0

    Cheers,
    Frank

  2. Hallo, vielen Dank für den Tipp. Funktioniert leider gerade mir LEFT OUTER JOIN bzw. RIGHT OUTER JOIN nicht.

    Vielleicht habe ich mich einwenig schlecht ausgedrückt:

    Nehmen wir an, dass es 5 User gibt in der "usertabelle"

    Usertabelle:
    UseriID Name Wohnort
    1 Peter Berlin
    2 Udo  Stuttgart
    3 Ida  Frankfurt
    4 Robert Mainz
    5 Paul Hamburg

    In der Tabelle "flirttabelle" sind nicht alle  UserID's vorhanden:

    Flirttabelle:
    UserID FlirtID
    1  3
    2  3
    3  4

    Nun will ich mit der Query oberprüfen, ob in der Flirttabelle ein Treffer gelanden wird. Falls "nicht", dann soll er der Userid jedoch den Usernamen ausprucken, sprich:

    select count(A.userid), B.username from jf_flirttabelle AS A LEFT OUTER JOIN jf_usertabelle AS B ON A.userid=B.userid where userid=1 and friendid=3 GROUP BY userid, username ;

    Die Query spuckt jetzt richtig aus:

    count(a.userid) username
    1    Ida

    Wenn nur der Eintrag nicht in Flirttabelle vorhanden sollte, kommt überhaupt nichts raus.
    Er sollte aber dann eben für count(a.userid) "0" rausbringen, das mein Array noch gefüllt wird:

    count(a.userid) username
    0    Ida

    Also,kein Eintrag vorhanden.
    Ist das überhaupt so ohne weiteres möglich?

    1. hi,

      Wenn nur der Eintrag nicht in Flirttabelle vorhanden sollte, kommt überhaupt nichts raus.

      Weil du "falsch herum" gejoined hast.

      Deine User-Tabelle ist die, aus der du in jedem Fall einen Datensatz bekommen möchtest, egal ob in der Flirt-Tabelle passende Einträge vorhanden sind, oder nicht.

      Also User-Tabelle mit Flirt-Tabelle "LEFT OUTER" joinen, und nicht umgekehrt.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
    2. Hallo, vielen Dank für den Tipp. Funktioniert leider gerade mir LEFT OUTER JOIN bzw. RIGHT OUTER JOIN nicht.

      Doch, du musst es nur richtigrum anpacken.

      Usertabelle:
      UseriID Name Wohnort
      1 Peter Berlin
      2 Udo  Stuttgart
      3 Ida  Frankfurt
      4 Robert Mainz
      5 Paul Hamburg
      [...]
      Flirttabelle:
      UserID FlirtID
      1  3
      2  3
      3  4

      Soweit klar.

      Nun will ich mit der Query oberprüfen, ob in der Flirttabelle ein Treffer gelanden wird. Falls "nicht", dann soll er der Userid jedoch den Usernamen ausprucken, sprich:

      Du willst also wissen, welche User wieviele Flirtkontakte haben?

      select count(A.userid), B.username from jf_flirttabelle AS A LEFT OUTER JOIN jf_usertabelle AS B ON A.userid=B.userid where userid=1 and friendid=3 GROUP BY userid, username ;

      Der LEFT JOIN bringt dir alle Ergebnisse der linken - also der Flirttabelle - kombiniert mit den Ergebnissen der Usertabelle. Du willst doch aber alle User haben, auch wenn sie noch keinen Kontakt haben, oder? Dann müsste das so funktionieren:

      SELECT  
        usertabelle.userid  
        name,  
        COUNT(flirttabelle.FlirtID) AS Kontakte  
      FROM  
        usertabelle  
      LEFT JOIN  
        flirttabelle  
      ON  
        usertabelle.userid = flirttabelle.userid  
      GROUP BY  
        usertabelle.userid
      

      Das ergibt für alle User aus der Usertabelle die Anzahl der Einträge in der Flirttabelle, also mit wievielen anderen Usern derjenige momentan verbandelt ist. Sind keine Einträge vorhanden, gibt's 0. Wenn's das auch nicht ist, verstehe ich ehrlich gesagt nicht, was du da genau abfragen willst.

      Siechfred

      --
      Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
      1. Hallo,

        Doch, du musst es nur richtigrum anpacken.

        Oh, habs evtl. verwechselt. Gerade habe ich mehrere Möglichkeiten durchprobiert, vertauscht, RIGHT, LEFT usw.
        Das ganze funktioniert, wenn ein Eintrag in flirttabelle vorhanden ist, ansonsten gibts keine Datensätze.

        Usertabelle:
        UseriID Name Wohnort
        1 Peter Berlin
        2 Udo  Stuttgart
        3 Ida  Frankfurt
        4 Robert Mainz
        5 Paul Hamburg
        [...]
        Flirttabelle:
        UserID FlirtID
        1  3
        2  3
        3  4

        Soweit klar.

        Nun will ich mit der Query oberprüfen, ob in der Flirttabelle ein Treffer gelanden wird. Falls "nicht", dann soll er der Userid jedoch den Usernamen ausprucken, sprich:

        Du willst also wissen, welche User wieviele Flirtkontakte haben?

        select count(A.userid), B.username from jf_flirttabelle AS A LEFT OUTER JOIN jf_usertabelle AS B ON A.userid=B.userid where userid=1 and friendid=3 GROUP BY userid, username ;

        Der LEFT JOIN bringt dir alle Ergebnisse der linken - also der Flirttabelle - kombiniert mit den Ergebnissen der Usertabelle. Du willst doch aber alle User haben, auch wenn sie noch keinen Kontakt haben, oder? Dann müsste das so funktionieren:

        SELECT

        usertabelle.userid
          name,
          COUNT(flirttabelle.FlirtID) AS Kontakte
        FROM
          usertabelle
        LEFT JOIN
          flirttabelle
        ON
          usertabelle.userid = flirttabelle.userid
        GROUP BY
          usertabelle.userid

        
        >   
        > Das ergibt für alle User aus der Usertabelle die Anzahl der Einträge in der Flirttabelle, also mit wievielen anderen Usern derjenige momentan verbandelt ist. Sind keine Einträge vorhanden, gibt's 0. Wenn's das auch nicht ist, verstehe ich ehrlich gesagt nicht, was du da genau abfragen willst.  
          
        Mein Problem liegt glaube ich an dem Where Teil, da ich nicht alle User von Usertabelle ausgeben will und die dazugehörigen Einträge in Flirttabelle ermitteln, sondern, genau speziell prüfen, ob der Eintrag "where userid=1 and flirtid=3" in flirttabelle vorhanden ist oder nicht. Das soll mir dann eine 0 oder eine 1 zurückgeben, mit dem usernamen von flirtid=1  
          
          
        Habs jetzt umgedreht:  
          
        ~~~sql
          
        select count(B.userid), A.username from usertabelle AS A LEFT OUTER JOIN flirttabelle AS B ON A.userid=B.userid where userid=1 and flirtid=3 GROUP BY userid, username ;
        

        die Query gibt korrekt dann aus:

        count(a.userid) username
        1    Ida

        Wenn ich flirtid=5 mache. Kommt nichts raus, weil es die Zeile ( userid=1 und flirtid=5)ja in der flirttabelle nicht gibt.
        Ich brauche aber dennoch einen Datensatz, dann eben mit einer 0 (dass es die Zeile nicht gibt und der usernamen (5=Paul))

        count(a.userid) username
        0    Paul

        Hoffentlich nerve ich euch jetzt nicht. Stehe gerade nur auf dem Schlauch, da das LEFT Join nun umgedreht habe und dennoch kein Datensatz rauskriege.

        Grüße

        1. hi,

          bitte zitiere sinnvoll, das worauf du dich konkret beziehst.

          Mein Problem liegt glaube ich an dem Where Teil, da ich nicht alle User von Usertabelle ausgeben will und die dazugehörigen Einträge in Flirttabelle ermitteln, sondern,

          Mach dir bitte klar, dass dir wesentlich effizienter geholfen werden kann, wenn du gleich dein _tatsächliches_ Vorhaben beschreibst - anstatt alle Helfer erst mal auf eine falsche Fährte zu locken.

          genau speziell prüfen, ob der Eintrag "where userid=1 and flirtid=3" in flirttabelle vorhanden ist oder nicht. Das soll mir dann eine 0 oder eine 1 zurückgeben, mit dem usernamen von flirtid=1

          Warum willst du dazu einen JOIN benutzen?
          Da könntest du gleich nur die Flirt-Tabelle abfragen - und das Ergebnis dieser Abfrage entsprechend auswerten, wie viele Datensätze sie geliefert hat, bzw. dort schon mit GROUP BY und COUNT arbeiten.

          Habs jetzt umgedreht:

          select count(B.userid), A.username from usertabelle AS A LEFT OUTER JOIN flirttabelle AS B ON A.userid=B.userid where userid=1 and flirtid=3 GROUP BY userid, username ;

          
          >   
          > die Query gibt korrekt dann aus:  
          >   
          > count(a.userid) username  
          > 1    Ida  
          >   
          > Wenn ich flirtid=5 mache. Kommt nichts raus, weil es die Zeile ( userid=1 und flirtid=5)ja in der flirttabelle nicht gibt.  
            
          Ja wieso bitte fragst du denn dann nach einer solchen Zeile?  
            
          Was kommt denn raus, wenn du die WHERE-Klausel bei dieser Abfrage mal weglässt ...?  
            
          
          > Stehe gerade nur auf dem Schlauch, da das LEFT Join nun umgedreht habe und dennoch kein Datensatz rauskriege.  
            
          Natürlich nicht, das hast du ja mit deiner WHERE-Klausel explizit verhindert.  
            
          gruß,  
          wahsaga  
            
          
          -- 
          /voodoo.css:  
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          
          1. Hi,

            Warum willst du dazu einen JOIN benutzen?
            Da könntest du gleich nur die Flirt-Tabelle abfragen - und das Ergebnis dieser Abfrage entsprechend auswerten, wie viele Datensätze sie geliefert hat, bzw. dort schon mit GROUP BY und COUNT arbeiten.

            Ja, davor hatte ich nur nur mit count die Flirt-Tabelle abgefragt:

            int abfrage=select count(*) from flirttabelle where userid=1 and flirtid=3;

            Nun konnte ich mit einer IF-Abfrage bestimmte Meldungen ausgeben:

            if (abfrage==0) { Deine Eingabe wurde gespeichert, du findest das Mitglied attraktiv}
            else if (abfrage==1) {Du findest das Mitglied schon attraktiv}

            Mein Problem war, dass ich anstatt "Mitglied" den Usernamen ausgeben und nicht noch eine zweite Query verballen wollte, indem ich zusätzlich noch den Namen abfrage.

            Ja wieso bitte fragst du denn dann nach einer solchen Zeile?

            Um speziell zu prüfen, ob eine Person eine bestimmte Person schon attraktiv findet.

            Was kommt denn raus, wenn du die WHERE-Klausel bei dieser Abfrage mal weglässt ...?

            Jep, dann werden alle Mitglieder ausgespuckt die vorhanden sind. Die Spalte count mit 1, wenn ein Eintrag in Flirt-Tabelle vorhanden ist, ansonsten 0. Aber, damit habe ich nicht speziell einen User abgefragt.

            Wie auch immer. Am besten, ich verballere dann dort zwei Queries. Danke, dass ich für mich Zeit genommen habt.

            Grüße

            1. hi,

              Ja wieso bitte fragst du denn dann nach einer solchen Zeile?

              Um speziell zu prüfen, ob eine Person eine bestimmte Person schon attraktiv findet.

              Noch mal: Warum willst du dafür einen JOIN benutzen?

              Und warum willst du unbedingt einen Datensatz zurückbekommen, der in einer bestimmten Spalte eine 0 enthält?

              Frag doch einfach ab,
              select userid from flirttabelle where userid=1 and flirtid=3;

              • wenn user 1 uder 3 attraktiv findet, bekommst du (mindestens) einen Datensatz zurück, sonst keinen. Und daraus kannst du doch schon den gewünschten Schluss ziehen.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. Hallo,

                Noch mal: Warum willst du dafür einen JOIN benutzen?

                Und warum willst du unbedingt einen Datensatz zurückbekommen, der in einer bestimmten Spalte eine 0 enthält?

                Frag doch einfach ab,
                select userid from flirttabelle where userid=1 and flirtid=3;

                • wenn user 1 uder 3 attraktiv findet, bekommst du (mindestens) einen Datensatz zurück, sonst keinen. Und daraus kannst du doch schon den gewünschten Schluss ziehen.

                Du hast recht. Wie gesagt, wollte ich mit dem Join noch den Usernamen ermitteln, den ich nicht habe. Für den Namen muss ich dann noch eine zweite Query nehmen.

                Ich denke, dass es besser kommt, wenn da steht:
                Du findest den Peter schon attraktiv, anstatt:
                Du findest das Mitglied schon attraktiv. Darum ging es mir eigentlich nur.

                Grüße

                1. Ich denke, dass es besser kommt, wenn da steht:
                  Du findest den Peter schon attraktiv, anstatt:
                  Du findest das Mitglied schon attraktiv. Darum ging es mir eigentlich nur.

                  Um die Datenbank abzufragen, musst du doch zwangsläufig den Usernamen haben, denn derjenige, der flirten will, wird doch nicht die UserID auswählen, sondern den Klarnamen, oder?

                  Siechfred

                  --
                  Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                  1. Hi,
                    hi, hab das problem gerade mit zwei queries gelöst.

                    Um die Datenbank abzufragen, musst du doch zwangsläufig den Usernamen haben, denn derjenige, der flirten will, wird doch nicht die UserID auswählen, sondern den Klarnamen, oder?

                    am anfang des scriptes wird mit random ein zufälliger user erzeugt, den man bewerten kann. (hier die id, richtiger usernamen usw.)

                    man bewertet nun jemand (sprich, man findet jemand attraktiv, dann sendet man die userid und attraktiv=1 wieder an das script)

                    das script erzeugt nun wieder zufällig einen neuen user zum bewerten, falls eine bewertung auch gleich vorliegt (in der URL userid und attraktiv=1), wertet er dies aus und gibt dementsprechend die meldung aus.

                    ich merke aber gerade, zusätzlich zu den parametern attraktiv, userid, könnte ich noch den usernamen übergeben und dies dementsprechend in die meldung einbauen ;)

                    wie auch immer. wäre aber auch so interessant, ob das mit der query so geht. interessant allemale.

                    grüße

                    1. man bewertet nun jemand (sprich, man findet jemand attraktiv, dann sendet man die userid und attraktiv=1 wieder an das script)

                      Was spricht dagegen, den Namen (mit) zu senden?

                      Siechfred

                      --
                      Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                      1. hi,
                        eigentlich nichts. das werde ich dann auch so machen nun und brauch dann auch keine neue query zu verbraten.

                        interessant wäre es aber schon, wenn man mit der einen query prüfen müsste und gleichzeitig auch den namen holen könnte.
                        wichtig ist, dass das script nun so funktioniert, wie ich es haben wollte.

                        danke nochmals.

                        grüße