Problem mit einer Datenbankabfrage

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

  • Problem mit einer Datenbankabfrage


    Hab da mal ein Problem und komm absolut nicht weiter. Vielleicht hat ja
    einer von euch einen Lösungsansatz.

    So, versuch ich noch mal zu erklären was für ein Problem ich habe.
    In eine Tabelle Namens userliste_db können User ihre eigene Modelle
    eintragen. Die Liste kann dann vom User aufgerufen werden und er
    bekommt dann eine Auflistung seiner Modelle. Das mach ich mit:

    PHP-Code:
    $result_typ mysql_query("SELECT * FROM userliste_db WHERE 
    userid = '
    {$_GET['userid']}'");
    while(
    $row_typ mysql_fetch_row($result_typ)){ 

    Diese Funktion haben auch sehr viele schon genutzt und es befinden sich
    ca. 6000 Einträge in der Tabelle.

    Hier mal ein Auszug der userliste_db:
    id interne typ Artikelnr userid
    1 5 Audi A4 DTM 50364-040 1
    2 5 Audi A4 DTM 50364-050 1
    381 5 Audi A4 DTM 50364-050 2
    128 5 Audi A4 DTM 50364-040 3
    129 5 Audi A4 DTM 50364-050 3
    5032 5 Audi A4 DTM 50364-040 4
    5031 5 Audi A4 DTM 50364-050 4
    962 5 Audi A4 DTM 50364-050 5
    1155 5 Audi A4 DTM 50364-040 8
    1156 5 Audi A4 DTM 50364-050 8
    1156 5 Audi A4 DTM 50364-090 10

    Wie man sieht taucht eine Artikelnr. mehrfach auf.
    Nun wollten viele eine Abfrage wo sie angezeigt bekommen welche Modelle
    (Artikelnr) ihnen noch fehlen. Das wollte ich mit dieser Abfrage erreichen:

    PHP-Code:
    $result_typ mysql_query("SELECT * FROM userliste_db WHERE NOT
    userid = '
    {$_GET['userid']}'");
    while(
    $row_typ mysql_fetch_row($result_typ)){ 

    Das Problem dabei ist, das die Artikelnr auch angezeigt werden die der
    User (userid) schon hat.
    z.b.: Mit der userid 1 bekomm ich folgende Ausgabe
    3 * 50364-040
    5 * 50364-050
    1 * 50364-090
    sollte aber eigentlich nur 1 * 50364-090 sein, da die userid 1 die anderen
    zwei Artikelnr. schon hat. Da aber bei den anderen Artikelnr nicht die
    userid 1 steht bekomm ich halt alle angezeigt. Deswegen dachte ich mir,
    das man die Artikelnr ausfiltern kann. Es sollen immer nur die Artikelnr
    erscheinen die der User (userid) nicht hat und die sollten auch nicht
    doppelt erscheinen. Mit DISTINCT hatte ich es auch schon probiert,
    allerdings ohne Erfolg. Hat jemand vielleicht eine Idee wie ich das
    umsetzen kann?

    Ich sag schonmal Danke im vorraus

  • #2
    Das Gegenteil von = ist !=. Das NOT hat da nichts verloren.

    Es fehlt übrigens das sehr wichtige SQL-Escaping, ohne dem dein Code sehr anfällig für gefährliche SQL-Injections ist.

    SELECT * sollte man nicht verwenden, sondern immer die Spalten angeben, die man haben will.

    Kommentar


    • #3
      Damit != habe ich es auch schon probiert. Trotzdem werden mir die Artikelnr. mehr-
      fach angezeigt. Den Code habe ich nur zusammengeschrumpft damit es übersicht-
      sichtlich bleibt. Das mysql_real_escape_string ist auch vorhanden.
      Bevor das auf meinen Server kommt, wird alles wieder eingebaut. Im Moment geht es
      ja nur darum die Abfrage so hinzubekommen wie ich es schon geschrieben habe.
      Trotzdem Danke für den Hinweis

      Kommentar


      • #4
        PHP-Code:
        $result mysql_query("
            SELECT DISTINCT t1.artikelnr
            FROM userliste_db t1
            LEFT JOIN userliste_db t2 ON ( t1.artikelnr = t2.artikelnr AND t2.userid = " 
        . (int)$_GET['userid'] . " )
            WHERE t2.artikelnr IS NULL
        "
        ); 

        Kommentar


        • #5
          Respekt und vielen Dank

          Hatte schonmal mit LEFT JOIN gebastelt und dazu noch eine andere Tabelle genutzt:
          SELECT
          detail_db.Artikelnr,
          userliste_db.interne,
          userliste_db.typ,
          userliste_db.userid
          FROM detail_db
          LEFT JOIN
          userliste_db ON detail_db.Artikelnr=userliste_db.Artikelnr

          Hatte aber leider nicht zu dem Ergebnis geführt.

          Zwei Fragen hätte ich aber noch ;-)
          Die Abfrage bringt eine sehr hohe Systemlast, kann man das irgendwie optimieren?
          Wie kann ich da jetzt noch einen count einbauen um mir anzeigen zulassen wieviele
          Datensätze er ausgibt?

          Kommentar


          • #6
            Zitat von MPC Beitrag anzeigen
            Zwei Fragen hätte ich aber noch ;-)
            Die Abfrage bringt eine sehr hohe Systemlast, kann man das irgendwie optimieren?
            Einen Index setzen hilft meistens. EXPLAIN gibt darüber Auskunft, was so lange dauert.

            Zitat von MPC Beitrag anzeigen
            Wie kann ich da jetzt noch einen count einbauen um mir anzeigen zulassen wieviele
            Datensätze er ausgibt?
            COUNT(DISTINCT t1.artikelnr)

            Kommentar


            • #7
              Sorry wenn ich nerve, das mit dem COUNT(DISTINCT t1.artikelnr) versteh
              ich gerade nicht. Wo müßte ich das denn einbauen? Anbei mal Deine
              Abfrage, hab sie noch um zwei Spalten erweitert, da ich diese
              Informationen auch noch benötige.

              PHP-Code:
              $result mysql_query("
                  SELECT DISTINCT t1.artikelnr, t1.typ, t1.interne
                  FROM userliste_db t1
                  LEFT JOIN userliste_db t2 ON ( t1.artikelnr = t2.artikelnr AND t2.userid = " 
              . (int)$_GET['userid'] . " )
                  WHERE t2.artikelnr IS NULL
              "
              );  
              while(
              $row_typ mysql_fetch_row($result)){ 
              Hier erfolgt die Ausgabe

              Kommentar


              • #8
                Suchst du mysql_num_rows()?

                PHP: mysql_num_rows - Manual

                Kommentar


                • #9


                  Das passiert, wenn man vor lauter Bäumen den Wald nicht mehr sieht

                  Auf jedenfall und nochmal vielen Dank.

                  Kommentar

                  Lädt...
                  X