Geht das nicht kürzer?

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

  • Geht das nicht kürzer?

    Hallo,

    ich habe ein wenig gebastelt um ein Problem zu lösen.
    Die Lösung funktioniert, jedoch frage ich mich ob es nicht einen eleganteren Weg gibt.

    Tabelle 1 enthält Gruppenids und userids
    Tabelle 2 enthält Gruppenids

    Jetzt selektiere ich alle Gruppenids von User Beispiel und will wissen ob mindestens eine mit den Werten aus Tabelle 2 überein stimmt.

    Dann soll ein zusätzliches Dropdownfeld im Formular angezeigt werden.
    Hier meine Bastellösung:
    PHP-Code:
    //----- Mitarbeitereintrag Dropdown -----
    //Abteilungen aus Contact Datenbank auslesen
    $sqlA="SELECT abt_id,abt_name,abt_grp FROM contact_abteilungen ORDER BY abt_name ASC";
    $resultAmysql_query($sqlA) OR die(mysql_error());
    //Abteilungen in Array packen
    while($dataA mysql_fetch_array($resultA))
    {
    $abt_array[] = $dataA['abt_grp'];
    }

    //Gruppenids vom Benutzer auslesen
    $sqlB="SELECT group_id,user_id,user_pending FROM isfboard_user_group WHERE user_id = '".$userdata['user_id']."' and user_pending = '0'";
    $resultBmysql_query($sqlB) OR die(mysql_error());
    while(
    $dataB mysql_fetch_array($resultB))
    {
    $grp_array[] = $dataB['group_id'];
    }

    //Abteilungen und Gruppenids auf gemeinsamkeiten prüfen
    $vergleich array_intersect($grp_array$abt_array);

    //Bei übereinstimmung Check +1
    $check 0;
    foreach(
    $vergleich AS $ausgabe)
       {
       
    $check = +1;
       }
    //Wenn Check größer 0, dann Feld anzeigen
    if ($check '0'){
    echo 
    "<span class='FormText'>Eintragsart*:</span><br>";
    echo 
    "<select name='mitarbeitereintrag'>";
    echo 
    "    <option selected='selected' value='z'>Bitte auswählen...</option>";
    echo 
    "    <option value='0'>Eigene Anfrage</option>";
    echo 
    "    <option value='1'>Anfrage für andere(n)</option>";
    echo 
    "    </select><br>";

    Geht das nicht eleganter?
    Zuletzt geändert von GregoriMarow; 09.09.2012, 20:03. Grund: falscher bb code

  • #2
    wenn das irgendwann funktioniert, dann ist das ein Zufall.

    Du kannst doch Übereinstimmungen, oder ihr Anzahl mit SQL berechnen. Mit "JOIN" und count() wäre Problem lösbar.
    Slava
    bituniverse.com

    Kommentar


    • #3
      hi,
      danke für die Antwort.
      Ähm das ist keineswegs Zufall das läuft sehr zuverlässig, frisst halt nur sehr viel Code und die Ausführungszeit ist nicht gerade "schnell"

      Ich hab mal das Orakel benutzt und komme irgendwie nicht mit den Beispielen zurecht, vielleicht kann mir jemand helfen.

      Ich stell nochmal die beiden Abfragen der Tabellen da um zu verdeutlichen worum es geht (hab das ganze noch etwas verändert):


      Selektiere aus Tabelle alle abt_grp
      PHP-Code:
      SELECT abt_id,abt_grp FROM contact_abteilungen 
      Selektiere alle Gruppen in denen der USER (aktives) Mitglied ist.
      PHP-Code:
      SELECT group_id,user_id,user_pending FROM isfboard_user_group WHERE user_id '".$userdata['user_id']."' and user_pending '0' 
      Jetzt will ich wissen ob abt_grp (Beispiel:5 Werte) und die aus group_id (Beispiel 9 Werte) mindestens einen oder mehr Gemeinsamkeiten haben.
      Als Ausgabe brauch ich dann true oder false oder 0 und 1.

      Kommentar


      • #4
        dann bau doch gleich nen JOIN

        Code:
        [COLOR=#000000][COLOR=#0000CC]SELECT 
          group_id[/COLOR][COLOR=#006600],[/COLOR][COLOR=#0000CC]user_id[/COLOR][COLOR=#006600],[/COLOR][COLOR=#0000CC]user_pending,ca.[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000CC]abt_id[/COLOR][COLOR=#006600],ca_[/COLOR][COLOR=#0000CC]abt_grp[/COLOR][/COLOR]
        [COLOR=#000000][COLOR=#0000CC]FROM 
          isfboard_user_group
        LEFT JOIN
          [/COLOR][/COLOR][COLOR=#000000][COLOR=#0000CC]contact_abteilungen AS ca ON ca.[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000CC]abt_id[/COLOR][COLOR=#006600]=group_id
        WHERE
          [/COLOR][/COLOR][COLOR=#000000][COLOR=#0000CC]user_id [/COLOR][COLOR=#006600]= [/COLOR][COLOR=#CC0000]'".$userdata['[/COLOR][COLOR=#0000CC]user_id[/COLOR][COLOR=#CC0000]']."' [/COLOR][COLOR=#006600]and [/COLOR][COLOR=#0000CC]user_pending [/COLOR][COLOR=#006600]= [/COLOR][COLOR=#CC0000]'0'
        [/COLOR][/COLOR]
        wenn du in dieser Reihenfolge nicht deine erhoffte Antwort erhältst, dann dreh die Abfrage mit dem Join um (also die direkt abgefragte Tabelle mit der beim JOIN austauschen)
        Ziel ist, dass du für alle erfolgreich abgebildeten Gruppen eben die ID bekommst - und falls keine passende gefunden wurde (weil der User eben nicht Mitglied in Gruppe X ist) bekommst du ein NULL - das NULL kannst du dann auf PHP-Seite zum gewünschten FALSE umwandeln
        [COLOR=#000000][COLOR=#CC0000] [/COLOR][/COLOR]
        [font=Verdana]
        Wer LESEN kann, ist klar im Vorteil!
        [/font]

        Kommentar


        • #5
          Dankeschön
          Abfrage im Beispiel war zwar nicht komplett korrekt, aber das gab den entschiedenen Anstoß zur Lösung:

          PHP-Code:
          $abfrage="
          SELECT 
            group_id,user_id,user_pending,ca.abt_grp
          FROM 
            isfboard_user_group
          LEFT JOIN
            contact_abteilungen AS ca ON ca.abt_grp=group_id
          WHERE
            user_id = '"
          .$userdata['user_id']."' and user_pending = '0' and ca.abt_grp=group_id";
          $ergebnismysql_query($abfrage) OR die(mysql_error());
          $anz mysql_num_rows($ergebnis);

          if (!empty (
          $anz)){
          echo 
          "<span class='FormText'>Eintragsart*:</span><br>";
          echo 
          "<select name='ct_typ'>";
          echo 
          "    <option selected='selected' value='z'>Bitte auswählen...</option>";
          echo 
          "    <option value='0'>Eigene Anfrage</option>";
          echo 
          "    <option value='1'>Anfrage für andere(n)</option>";
          echo 
          "    </select><br>";

          Kommentar


          • #6
            welchen Sinn hat in diesem Fall ein LEFT join?
            Slava
            bituniverse.com

            Kommentar


            • #7
              and ca.abt_grp=group_id";

              ist redundant

              Kommentar


              • #8
                slava : er wollte ja eine Information darüber, welche Gruppen beim User vorhanden sind und welche nicht - wenn du per Inner Join abfragst, bekommst du NUR die Info über Gruppen des Users, nicht aber die über die anderen Gruppen - LEFT JOIN bietet halt beides (wenn die Abfrage in die richtige Richtung läuft - denn dann hast du NULL bei Gruppen, wo der User kein Mitglied ist ...)
                [font=Verdana]
                Wer LESEN kann, ist klar im Vorteil!
                [/font]

                Kommentar


                • #9
                  Zitat von eagle275 Beitrag anzeigen
                  slava : er wollte ja eine Information darüber, welche Gruppen beim User vorhanden sind und welche nicht - wenn du per Inner Join abfragst, bekommst du NUR die Info über Gruppen des Users, nicht aber die über die anderen Gruppen - LEFT JOIN bietet halt beides (wenn die Abfrage in die richtige Richtung läuft - denn dann hast du NULL bei Gruppen, wo der User kein Mitglied ist ...)
                  Wenn ich code ansehe, dann schaut er nur auf Anzahl von Datensätzen
                  PHP-Code:
                  $anz mysql_num_rows($ergebnis); 
                  und für diese Zwecke hat ein LEFT JOIN kein Sinn, man kann direkt die erste tabelle aufrufen.

                  Code:
                  ..... 
                  LEFT JOIN
                  ................. AS ca ON       ca.abt_grp=group_id
                  WHERE
                  ................................. and ca.abt_grp=group_id";
                  In diesem Fall macht ca.abt_grp=group_id in WHERE Bedingung aus einem Left Join wieder ein INNER JOIN
                  Slava
                  bituniverse.com

                  Kommentar


                  • #10
                    das hat er aber da reingestrickt - bei mir im Codeschnipsel findest du das nicht
                    [font=Verdana]
                    Wer LESEN kann, ist klar im Vorteil!
                    [/font]

                    Kommentar

                    Lädt...
                    X