Abfrage aus 2 Tabellen liefert zu viele Ergebnisse

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

  • Abfrage aus 2 Tabellen liefert zu viele Ergebnisse

    Hi!
    Ich habe folgendes Problem: Ich will

    - aus der einen Tabelle alle Daten auslesen:

    CREATE TABLE `termine` (
    `termine_id` int(11) NOT NULL,
    `termine_what` text NOT NULL,
    `termine_date` datetime NOT NULL,
    `termine_where` varchar(100) NOT NULL,
    `termine_who` varchar(100) NOT NULL,
    PRIMARY KEY (`termine_id`)
    ) TYPE=MyISAM AUTO_INCREMENT

    -und aus der anderen Tabelle nur 2 Spalten (user und termin), wobei die spalte user_termine_termin die termine_id enthält

    CREATE TABLE `user_termine` (
    `user_termine_id` int(11) NOT NULL,
    `user_termine_user` varchar(15) NOT NULL,
    `user_termine_termin` int(11) NOT NULL,
    `user_termine_angemeldet` text NOT NULL,
    `user_termine_erstellt` text NOT NULL,
    PRIMARY KEY (`user_termine_id`)
    ) TYPE=MyISAM AUTO_INCREMENT

    Dienen soll das ganze dazu, einen Button nur dann anzuzeigen, wenn der angemeldete user sich noch nicht für den Termin angemeldet hat.
    Alle Versuche meinerseits sind leider gescheitert, da ich entweder dür jeden angemeldeten User einen Datensatz zurückbekomme oder aber halt nur die Termine angezeigt bekommen bei denen sich bereits User angemeldet haben.
    So siehts momentan aus:
    PHP-Code:
    $query "SELECT * FROM `termine` as A, `user_termine` as B WHERE `termine_date` >= NOW() ORDER BY `termine_date` ASC LIMIT 0 , 30"
    $data mysql_query($query) or die (mysql_error()); 
    while(
    $row mysql_fetch_array($data)) {...} 
    Für eure Hilfe wäre ich echt dankbar. Sollte was nicht verständlich sein, versuch ichs gern nochmal zu erklären.


    Mfg

    Michi
    DAS Forum für PHP & ähnliches

  • #2
    diejenigen zu finden, die noch keinen Termin haben, geht mit einem left join. Suche folgendes Beispiel im mysql-Manual und passe es an.

    Beachte noch , dass die Syntax IS NULL heisst und nicht = NULL.

    PHP-Code:
    SELECT table1.* FROM table1
      LEFT JOIN table2 ON table1
    .id=table2.id
      WHERE table2
    .id IS NULL
    Zuletzt geändert von mai; 14.06.2006, 19:13.

    Kommentar


    • #3
      Danke dir, aber ich will ja nicht wissen wer noch keinen Termin hat, sondern ich will alle Termine anzeigen lassen. Nur dann will ich noch wissen ob der angemeldete user sich bei diesem termin schon angemeldet hat.
      DAS Forum für PHP & ähnliches

      Kommentar


      • #4
        Also da du keine separate user-tabelle hast, könnte es mit der folgenden
        Horrorkonstruktion gehen (GROUP statt dessen):

        PHP-Code:
        select a.user_termine_user as a_user
              
        b.*, 
              
        c.*, 
              (
        c.user_termine_termin IS NOT NULL) as ist_angemeldet
           from user_termine a
        termine b,
             
        left join user_termine c on 
                  
        (b.termine_id c.user_termine_termin
                
        and a.user_termine_user=c.user_termine_user)
          
        where b.termine_date >= NOW() 
          
        GROUP by a_user
          ORDER BY b
        .termine_date ASC LIMIT 0 30
        Das c.* kannst Du bei Desinteresse weglassen.

        Als Alternative taucht mir auf, alle users mit einer subquery im FROM herauszuziehen:
        PHP-Code:
        ... from (select distinct user_termine_user from user_terminea... 
        *vg*

        Kommentar


        • #5
          Hi!

          Irgendwie blick ich da bei dir nicht so durch. Bin leider noch ein rechter Newbie was MySQL anfragen angeht.
          Ich hab meine Anfrage mittlerweile so weit:
          PHP-Code:
          SELECT A.* , B.user_termine_terminB.user_termine_user 
          FROM termine 
          AS 
          LEFT JOIN user_termine 
          AS B ON A.termine_id B.user_termine_termin 
          WHERE B
          .user_termine_user '$_SESSION['user']'  LIMIT 0 30 
          Als ausgabe bekomme ich mittlerweile halt nur noch die Termine, für die sich der user auch registriert hat.
          Was ich genau bräuchte wäre eine Abfrage, die mir komplett die Daten aus der Tabelle termine ausgibt und dazu noch aus der Tabelle user_termine.
          Und zwar genau dann, wenn termine_id = user_termine_termin. Ansonsten sollte er die Felder einfach als NULL zurückgeben.
          DAS Forum für PHP & ähnliches

          Kommentar


          • #6
            Also, du willst für einen bestimmten user '$_SESSION['user']' alle möglichen Termine
            haben, zusammen mit einer Angabe für jeden Termin ob er sich schon angemeldet
            hat oder nicht? Das ist einfach, wenn es nur um das geht.

            Im ersten post hast Du keine Bedingung auf einen bestimmten user, jetzt ist diese
            plötzlich aufgetaucht.......dafür ist die now() Bedingung entfallen. Zwischendruch
            wolltest Du etwas für die angemeldeten users. Was gilt ?

            Und machst Du zufällig ein Durcheinander zwischen angemeldet im Sinn von
            logged-in und angemeldet im Sinne von für den Prüfungs-/Arztermin angemeldet?

            Kommentar


            • #7
              vielleicht sowas?
              PHP-Code:
              $sql="SELECT A.* , B.user_termine_termin, B.user_termine_user 
              FROM termine AS A 
              LEFT JOIN user_termine AS B ON (A.termine_id = B.user_termine_termin 
                 A N D    B.user_termine_user = '
              {$_SESSION['user']}' ) LIMIT 0 , 30"

              Kommentar


              • #8
                Sorry, wenns n bisschen kompliziert war... Aber das letzte passt optimal! Kannst du mir des mit dem ON mal erklären? Des Blick i no net ganz.
                DAS Forum für PHP & ähnliches

                Kommentar


                • #9
                  "on" zeigt bei standart-sql verbund von tabellen.

                  on tabellenname1.feldname=tabellenname2.feld

                  bei mehreren datenbanksystemen kann man auf "on" verzichten und verbund von tabellen in "where" zuschreiben.

                  "on" ist aber übersichtlich, da man genau weist, dass es in dieser Teil um Verbund von tabellen handelt und hält zusätzliche Abfragebedingungen davon getrennt.
                  Slava
                  bituniverse.com

                  Kommentar


                  • #10
                    Ich glaub jetzt hab ichs...
                    Thx a lot

                    michi
                    DAS Forum für PHP & ähnliches

                    Kommentar

                    Lädt...
                    X