Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbank abfrage über mehrere (3) tabellen

Einklappen

Neue Werbung 2019

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

  • Datenbank abfrage über mehrere (3) tabellen

    Hallo,
    ich bin seit einigen Wochen am verzweifeln, denn ich bekomme es nicht hin, das ich "eine" abfrage mache, die jedoch auch 2 andere tabellen mit überprüft und somit sachen "ignoriert"

    derzeit löse ich dies über while schleifen, welche natürlich sehr sehr viel leistung verbrauchen und auch lange ladezeiten usw verursachen.

    PHP-Code:
    $sbpos "0";
    while (
    $h 1) {
      
    $trafficseite $db->query("SELECT * FROM equinox_".$pageconfig['install_nr']."_traffic WHERE status='1' ORDER BY verguetung DESC LIMIT ".$sbpos." , 1");
      while(
    $t_seite=mysql_fetch_array($trafficseite)) {
        
    $sbpos++;

        
    $reload $db->query("SELECT * FROM equinox_".$pageconfig['install_nr']."_traffic_reload WHERE ip='".$ip."' AND tan='".$t_seite['tan']."'");
        
    $isreload mysql_num_rows($reload);
      
        if (
    $isreload "1") {
          
    $sbbll $db->query('SELECT * FROM equinox_'.$pageconfig['install_nr'].'_blacklist_surfbar WHERE tan = "'.$t_seite['tan'].'" AND nickname = "'.$userdaten['nickname'].'"');
          
    $sbbllt mysql_num_rows($sbbll);
          
    $sbbll2 $db->query('SELECT * FROM equinox_'.$pageconfig['install_nr'].'_blacklist_surfbar WHERE tan = "'.$t_seite['tan'].'" AND nickname = "ALLE"');
          
    $sbbllt2 mysql_num_rows($sbbll2);

          if (
    $sbbllt == "0" AND $sbbllt2 == "0") {
             
    $h++;
             
    ### Aktionen die dann durchgeführt werden sollen und ende der schleife ###
          
    }
       }
      }

    also es soll 1 eintrag ausgelesen werden, dieser eintrag soll sich jedoch nicht in de reload tabelle und auch nicht in der blacklist sein.
    die obige schleifen werden also solange abgearbeitet bis dies zutrifft, jedoch ist das bei ein paar tausen einträgen wie bereits geschrieben sehr performance drückend und läd recht lange (was ja kein wunder ist)

    ich habe bereits mehrfach versucht dies in einer abfrage zu erledigen, jedoch hat dies nie funktioniert
    hoffe ihr könnt mir hierbei helfen.

    mfg
    nowaczuk


  • #2
    Ok, dein Code ist auch alles andere als Übersichtlich. Du musst da etwas mehr Struktur reinbekommen. Dann wird auch schneller klar, was nicht funktioniert.

    Was du im Grunde suchst, ist ein JOIN. Wenn ich dein Problem beim schnellen Überfliegen des Textes richtig verstanden habe, dann suchst du nach so einer Variante:

    PHP-Code:
    SELECT    
        
    <fields>
    FROM
        
    <table> AS `t`
    LEFT JOIN
        
    <join-table> AS `jtON `jt`.`table_id` = `t`.`id`
    WHERE
        ISNULL
    (`jt`.`id`) 
    Finde alle Datensätze aus Tabelle "t", zu denen es in Tabelle "jt" keinen passenden Wert "id" der Tabelle "t" im Feld `jt`.`table_id` gibt.
    Die original mysql-Erweiterung ist veraltet (mysql_*-Funktionen) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
    Choosing an API
    Warum man mysql* generell nicht (mehr) nutzen sollte.
    Wie man von mysql* auf PDO umsteigt
    Wissenswertes zum Thema SQL-Injection
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      hi, schonmal danke für die antwort
      müsste der eintrag nicht LEFT OUTER JOIN sein für nicht vorhanden? das würde eventuell erklären warum es bei mir nie ging, dann ich hatte es immer mit LEFT OUTER JOIN versucht
      die abfrage von dir würde jedoch nur eine weitere tabelle prüfen, und keine zwei.
      wäre das denn soweit richtig? (hab es mal versucht in dem format von dir zu schreiben, auch wenn dies für mich vielmehr unübersichtlicher ist als das von mir)

      PHP-Code:
      SELECT 
           
      *
      FROM
           equinox_
      ".$pageconfig['install_nr']."_traffic AS k
      LEFT JOIN
           equinox_
      ".$pageconfig['install_nr']."_traffic_reload AS krl ON krl.ip '".$ip."' AND k.tan krl.tan
      WHERE
           ISNULL
      (krl.ip AND krl.tan

      Kommentar


      • #4
        kann sonst niemand irgendwie helfen?
        ich hab es nun so, jedoch ist die ladezeit sobald mehrere einträge in der reload-tabelle sind extrem hoch, geb ich sogar eine sortierung (ORDER BY k.verguetung DESC) mit an, ist die ladezeit jenseits von gut und böse......
        so hab ich die abfrage nun, was stimmt denn daran nicht, bzw was kann man da besser machen?
        PHP-Code:
        SELECT
            k
        .tank.kidk.sponsork.aufendhaltk.linkk.verguetung
        FROM
            equinox_
        ".$pageconfig['install_nr']."_traffic_1 AS k
        LEFT JOIN
            equinox_
        ".$pageconfig['install_nr']."_traffic_reload AS krl ON ('".$ip."' krl.ip AND k.tan krl.tan)
        WHERE
            ISNULL
        (krl.tan)
        LIMIT 1 

        Kommentar


        • #5
          Zeig' mal SHOW CREATE TABLE der beiden Tabellen.
          Standards - Best Practices - AwesomePHP - Guideline für WebApps

          Kommentar


          • #6
            hier von traffic_1
            PHP-Code:
            CREATE TABLE `equinox_1_traffic_1` (
             `
            uidint(11NOT NULL DEFAULT '0',
             `
            tanvarchar(32NOT NULL DEFAULT '',
             `
            kidint(11NOT NULL DEFAULT '0',
             `
            linktext NOT NULL,
             `
            reloadsperreint(11NOT NULL DEFAULT '0',
             `
            aufendhaltint(11NOT NULL DEFAULT '0',
             `
            verguetungdouble(16,8NOT NULL DEFAULT '0.00000000',
             `
            preisdouble(10,2NOT NULL DEFAULT '0.00',
             `
            gebuchtint(11NOT NULL DEFAULT '0',
             `
            sponsortext NOT NULL,
             `
            kampnamevarchar(35NOT NULL DEFAULT 'nix',
             `
            statusint(11NOT NULL DEFAULT '1',
             `
            viewsint(6NOT NULL DEFAULT '0' )
             
            ENGINE=MyISAM
             
            DEFAULT CHARSET=latin1 
            und hier von reload
            PHP-Code:
            CREATE TABLE `equinox_1_traffic_reload` (
             `
            ipvarchar(15NOT NULL DEFAULT '',
             `
            uidint(11NOT NULL DEFAULT '0',
             `
            tanvarchar(32NOT NULL DEFAULT '',
             `
            reload_bisint(11NOT NULL DEFAULT '0' )
             
            ENGINE=MyISAM
             
            DEFAULT CHARSET=latin1 
            also wenn in der reload tabelle die ip $ip eingetragen ist, mit der dazugehörigen tan, dann soll dieser eintrag eben nicht angezeigt werden
            und nach möglichkeit das ganze nach verguetung absteigend sortiert

            die reload tabelle schwankt immer so bei 14000-15000 einträgen
            die traffic_1 tabelle so etwa 2000-3000 einträge

            Kommentar


            • #7
              http://dev.mysql.com/doc/refman/5.1/...l-indexes.html
              Standards - Best Practices - AwesomePHP - Guideline für WebApps

              Kommentar


              • #8
                halleluja, ich könnte dich knutschen
                indexe sind gesetzt
                PHP-Code:
                CREATE TABLE `equinox_1_traffic_reload` (
                 `
                ipvarchar(15NOT NULL,
                 `
                uidint(11NOT NULL,
                 `
                tanvarchar(32NOT NULL,
                 `
                reload_bisint(11NOT NULL DEFAULT '0',
                 
                KEY `ip` (`ip`),
                 
                KEY `uid` (`uid`),
                 
                KEY `tan` (`tan`)
                 ) 
                ENGINE=MyISAM
                 
                DEFAULT CHARSET=latin1 
                die ladezeit ist nun absolut klasse
                ich danke für die hilfe, ich hoffe den rest (3. tabelle mit einbinden usw) schaffe ich somit alleine, falls nicht werde ich nochmahls schreiben
                das es so einfach sein kann, indem man indexe setzt, das hätte ich vorher einmal wissen sollen

                Kommentar


                • #9
                  asl?
                  Standards - Best Practices - AwesomePHP - Guideline für WebApps

                  Kommentar


                  • #10
                    hehe, glaub mir das willst du nicht wissen
                    also auch mit einbinden der dritten tabelle in der ich ebenfalls indexe gesetzt habe klappt es nun reibungslos und suuuuper schnell
                    vielen herzlichen dank für die hilfe und die geduld wegen meiner doofheit
                    endlich ein problem mit dem ich schon ewig rumprobiert und verzweifelt bin gelöst

                    Kommentar

                    Lädt...
                    X