Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabellen miteinander verknüpfen

Einklappen

Neue Werbung 2019

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

  • Tabellen miteinander verknüpfen

    Tag zusammen,

    ich habe ein Problem und weiß leider nicht, wie ich es lösen soll. Folgende Situation: Ich lese die Verbindungsdaten meiner Telefonanlage aus und speichere sie in einer Tabelle namens "log". In einer Spalte steht die Nummer des Teilnehmers (number). Nun habe ich eine zweite Tabelle (callers) mit zwei Spalten (person, number) angelegt, in welcher einige Rufnummern vorhanden sind.

    Ich möchte das ganze nun so haben, dass ich bei der Ausgabe den Namen des Anrufenden dort mit stehen habe. Derzeit hab ich das so gelöst:

    Code:
    select log.id, log.date, log.time, log.number, log.msn, callers.person, callers.number where log.number = callers.number order by log.date")
    Da es ja (leider ) auch Personen gibt, die ihre Nummer nicht senden, bleibe log.number bei einigen Einträgen leer und genau diese Erscheinen nicht in meiner Tabelle. Ist ja auch logisch denn in diesem Fall ist kann log.number ja nicht gleich callers.number sein, da log.number leer ist.

    Wie löse ich das?

    Viele Grüße

    Christoph

  • #2
    Lass doch einfach die WHERE Abfrage weg. Dann erhälst Du alle Datensätze (auch die, bei denen log.nummer = "").

    Code:
    ("SELECT log.id, log.date, log.time, log.number, log.msn, callers.person, callers.number ORDER BY log.date")

    Kommentar


    • #3
      Aber wie kriege ich es dann hin, dass die Namen in der Tabelle in der richtigen Spalte auftauchen? So lese ich ja nur den Log und die Liste der Anrufer. Das muss doch noch irgendwie miteinander verknüpft werden. Oder geschieht das im Hintergrund automatisch?

      Kommentar


      • #4
        Das könntest Du beim Ausgeben durch eine PHP Schleife lösen.

        Kommentar


        • #5
          Die PHP Schleife, die das alles in eine Tabelle schreibt ist ja auch schon vorhanden. Nur wie mache ich es, dass der zur Nummer passende Name in der Tabelle auftaucht?

          Derzeit wird ja nur gelesen:

          2004-06-09 | 13:55:23 | 4711

          Aus der zweiten Tabelle kommt:

          Fritz | 4711

          Wie mach ich es jetzt, dass die Ausgabe so aussieht:

          2004-06-09 | 13:55:23 | 4711 | Fritz

          Kommentar


          • #6
            Bau einfach innerhalb der Schleife die die Tabelle ausgibt an der Stelle die den Namen ausgibt eine weitere Schleife ein, die solange die Werte von log.number mit caller.number vergleicht bis sie fündig geworden ist und dann abbricht. Sollte kein Eintrag übereinstimmen (wenn die Nummer unterdrückt wurde) soll sie ebenfalls nichts hinneinschreiben.

            Das ganze könnte ungefähr so aussehen:



            Code:
             $result = mysql_query('SELECT id, date, time, number, msn FROM log ORDER BY date');
            
            echo ('<table>');
            
            while($row = mysql_fetch_array($result)) 
            { 
                     $telefonnummer = $row['number'];
            
                     echo ('<table>');		
                     echo ('<tr>');
                     echo ('<td>'.$row['date'].'<td>');
                     echo ('<td>'.$row['time'].'<td>');
                     echo ('<td>'.$row['number'].'<td>');
                     
                     $abgleichen = mysql_query('SELECT person, number FROM callers ORDER BY person');
            
                     while($row = mysql_fetch_array($result))
                             {
                                 if ($telefonnummer = $row['number'])
                                 {
            	     
                                 echo ('<td>'.$row['person'].</td>');
            	     
                                  }
            
                                 else
            
                                 {
                                 
                                 }
            						  
                             echo 	('</tr>');
            		
            	}
            
            echo ('</table>');
            Poste doch bitte mal ob es funktioniert, habe es nämlich nicht getestet (wie auch, hab ja die Datenbank und die Werte nicht).

            Viel Erfolg!

            Gruß
            MWingenbach

            Kommentar


            • #7
              Der erste Fehler ist mir schon aufgefallen:

              while($row = mysql_fetch_array($result))
              {
              $telefonnummer = $row['number'];

              echo ('<table>');
              echo ('<tr>');
              Das "echo ('<table>'); " ist zuviel. Es gehört vor die Schleife, also einfach wegdenken...

              Kommentar


              • #8
                Vielen Dank für Deine Hilfe. Leider bleibt das Feld leer. Woran könnte das liegen?

                BTW: Beansprucht es nicht zu viel Rechenzeit, bei jedem von ca 2000 Einträgen, noch mal ca 400 Telefonnummern vorbeilaufen zu lassen?

                Kommentar


                • #9
                  Sollte eigentlich keine Rolle spielen. Große Websites wie Amanzon oder ebay gleichen oft hunderttausende (oder noch viel mehr) einträgen ab. Ausserdem hast Du doch sicherlich ein oder zwei Sekunden Zeit bis das Ergebnis erscheint.

                  Es könnte evtl daran liegen, dass die Variable $telefonnummer innerhalb der zweiten Schleife keine Gültigkeit hat. Schau doch mal in einem PHP-Handbuch nach. Es gibt einen kleinen Code-Zusatz um dies zu gewährleisten (weiss ihn leider nicht auswendig, sorry).

                  Ansonsten solltest Du vielleicht noch die ein oder andere "or exit ('Abruch an Stelle XY')" einbauen um zu sehen wo der Fehler genau liegt.

                  Kommentar


                  • #10
                    Wofür sind eigentlich solche Sachen wie Primärschlüssel oder Index? Kann man das damit nicht irgendwie drehen?

                    Kommentar


                    • #11
                      So, habe es nun geschafft.

                      Es macht aus meiner Sicht keinen Sinn, alle Nummern/Namen zu laden, deswegen habe ich es jetzt so gemacht:

                      Code:
                      $abgleichen = mysql_query('SELECT person, number FROM callers WHERE `number` LIKE  '$telefonnummer' ORDER BY person');
                      Den Rest eben noch drumherum.

                      Da diese Lösung doch ein wenig braucht, um dargestellt zu werden und jemand evtl. eine bessere Lösung parat hat, kann er sie mir gerne zukommen lassen.

                      Vielen Dank auf jeden Fall erstmal!

                      Kommentar


                      • #12
                        Habt ihr schon mal was von Joins gehört?

                        select log.id, log.date, log.time, log.number, log.msn, callers.person, callers.number where log.number = callers.number order by log.date

                        SELECT log.id, log.date, log.time, log.number, log.msn, callers.person, callers.number FROM log LEFT JOIN callers on callers.number = log.number ORDER BY log.date

                        Selektiert alle aus log und alle aus callers wo callers.number = log.number

                        http://www.w3schools.com/sql/sql_intro.asp

                        greets
                        Com.Ci

                        Kommentar


                        • #13
                          Zitat von comci
                          Habt ihr schon mal was von Joins gehört?
                          Leider nicht, sonst hätte ich ja diesen Thread nicht eröffnet !

                          Zitat von comci
                          Selektiert alle aus log und alle aus callers wo callers.number = log.number
                          Hört sich sehr gut an, was passiert jedoch wenn log.number keinen Eintrag enthält?

                          Gruß,
                          DerStandart

                          Kommentar


                          • #14
                            Wenn du zwei Tabellen hast, t1 und t2, und sie über einen Left Join verbindest werden alle Felder aus t1 genommen und die aus t2 bei denen die Referenz (t1.number = t2.number) passt.
                            Probier's einfach mal aus.

                            Kommentar


                            • #15
                              Moin,

                              ich habe es alles einmal ausprobiert, klappt leider nicht.

                              Code:
                              $number_of_calls = mysql_num_rows($get_calls);
                              liefert eine Fehlermeldung. $get_calls ist in diesem Fall die Abfrage mit dem LEFT JOIN.

                              Hier noch die Abfrage:
                              Code:
                              $get_calls = mysql_query("SELECT log.ID, date_format(log.date, '%d.%m.%Y') as log.date, log.time, log.number, callers.number, callers.person FROM log LEFT JOIN callers ON log.number = callers.number ORDER BY log.ID ASC");
                              Weiß jemand, wo der Fehler liegen könnte? Ist an dfer Abfrage was falsch, oder warum liefert "mysql_num_rows" kein korrektes Ergebnis?

                              Gruß,
                              DerStandart

                              Kommentar

                              Lädt...
                              X