Filter-Alternativen zu DISTINCT und array_unique

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

  • Filter-Alternativen zu DISTINCT und array_unique

    Hallo liebe Community,

    ich komme leider nicht mehr aus eigener Kraft weiter und hoffe, dass Ihr mir helfen könnt.

    Ich möchte eine Datenbankabfrage von 8 Datenbankfeldern aus mehreren Datensätzen machen.
    Die Wörter sollen einfach nur hintereinander in einer Tabelle ausgeben werden.
    JEDOCH sollen doppelte Wörter ignoriert und die Wörter alphabetisch ausgegeben werden.
    Es dürfen also nachfolgende Wörter nur einmalig ausgegeben werden.

    Bsp:

    PHP-Code:
    ID   spalte1        spalte2       spalte3         spalte4                
    1    orangen        möhren        weintrauben     zitronen
    2    birnen         möhren        möhren          gurken
    3    orangen        kiwis         äpfel           birnen 
    Ich habe folgendes ausprobiert:

    Idee 1) Datenbankabfrage mit DISTINCT

    PHP-Code:
    $sql_spalten mysql_query("SELECT DISTINCT spalte1, spalte2, spalte3, spalte4 FROM tab_obstgemuese"); 
    Ergebnis: Funktionert. ABER DISTINCT ist nur auf eine Spalte je Abfrage anwendbar.
    Die Idee, einfach 4 Selects mit einzelnden DISTRICTs zu machen, ging jedoch nicht.
    Da kam mir nur die Array-Funktion in den Sinn...


    Idee 2) Doppelte Einträge via array_unique aus einem Array löschen

    PHP-Code:
    $sql_spalten mysql_query("SELECT spalte1, spalte2, spalte3, spalte4 FROM obst_tab");    

    while(
    $res_spalten mysql_fetch_array($sql_spaltenMYSQL_ASSOC)){   

        
    $woerter_merged array_merge($res_spalten[wort1], $res_spalten[wort2], $res_spalten[wort4], $res_spalten[wort4]);
        
    $woerter_doppelte_raus array_unique($woerter_merged);
        
    $woerter_sortiert ksort($woerter_doppelte_raus); 

    echo 
    '<pre>';
    var_dump($woerter_sortiert);
    echo 
    '</pre>'

    //Ausgabe der Wörter in einer Tabelle
    $spalten 4;
    $num=0;

    for(
    $x=0;$x<count($woerter_sortiert);$x++){  

     if (
    $num $spalten == 0)// Neue Zeile beginnen
     
    echo " </tr>\n  </tr>\n"
     echo
    "<td align=\"center\"><a href=\"#\"
     onClick=\"window.opener.document.woerter.wort.value = '"
    .$woerter_sortiert[$x] ."';window.close()\">"$woerter_sortiert[$x] ."</a></td>\n"
     
    $num++; 
    }


    Ergebnis: Was ich nicht wusste ist, dass das Skript ein mehrdimensionales Array anlegt
    Die doppelten Wörter wurden zwar in den Datensätzen der Zeilen (Unter-Array) herausgefiltert, aber wurden nicht im Haupt-Array entfernt.
    So bleiben z.B. die Wörter "Orangen" und "Möhren" doppelt in der Liste


    Idee 3) Mehrere geschachtelte Funktionen


    PHP-Code:
    $array_neu array_values(array_unique(array_merge($res_spalten[wort1], $res_spalten[wort2], $res_spalten[wort4], $res_spalten[wort4]))); 
    Ergebis: Das selbe wie bei Idee 2

    Idee 4) Funktionen mit Schleifenabfrage


    PHP-Code:
       $AlterArray array_unique(array_merge_recursive($res_spalten[wort1], $res_spalten[wort2], $res_spalten[wort4], $res_spalten[wort4]));
        
    $i 0;
        
        foreach(
    $AlterArray as $Wert)    {
            
    $NeuerArray[$i] = $Wert;
            
    $i++;
        }
        echo 
    $NeuerArray
    Ergebnis: Das selbe wie bei Idee 2



    In meiner Verzweiflung bin ich kurz davor eine harte Textdatei oder Hilfstabelle anzulegen, in die Stringvariablen per implode() reingeschrieben
    und wieder in ein nagelneues Array zurückgeschrieben wird. Blos das ist ja nun wirklich keine zufriedenstellende Lösung.



    Kann mir jemand einen Tipp geben?

    Vielleicht kann man das mehrdimensionale in ein eindimensionales Array umwandeln?
    Zuletzt geändert von MarcoCH; 29.06.2006, 23:47.

  • #2
    Schon mit GROUP BY versucht?

    Kommentar


    • #3
      Schon mal mit vernünftigem Tabellendesign versucht?
      Die Zeit hat ihre Kinder längst gefressen

      Kommentar


      • #4
        schon mal versucht den code umzubrechen?

        schon mal versucht ins richtige forum zu posten?

        *move* 2 sql
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Ich Danke Euch herzlich für Eure Antworten.

          @phppaule: Was genau meinst Du mit GROUP BY?

          @derHund: Das hat so seine Richtigkeit. Es handelt sich um ein dynamisches CMS. Es sollen dort Kategorien eingetragen werden.

          @Abraxax: War mir nicht sicher. Ist ja eher ein Array-Problem. ;-) Sorry.


          Bin aber gewissermaßen schon mal beruhigt, dass es kein Pille-Palle-Problem ist. Ich suche schon seit 2 Tagen eine Lösung.

          Ich werde mal etwas genauer:

          Es wird ein CMS. Der Admin hat die Möglichkeit für die Seitenerstellung Keywords zu bestimmen (Insgensamt 10 Stk). Jedes wird in einem Input-Feld ausgegeben und in einem eigenständigem Datenbankfeld gespeichert.
          Um dem Admin die Arbeit zu erleichtern, soll er ein Kategorie-Picker bekommen.

          Ein Pop-Up, wo alle Wörter aufgelistet sind, die er irgendwann mal eingegeben hat.
          Sinn: Im Laufe der Zeit kommen für jede erstellte Seite immer mehr Keywords dazu und der Admin kann sich diese bequem via Klick auswählen.
          Ich hoffe, ich hab das einigermaßen verständlich beschrieben.

          Also kriegt man das wohl nicht via Array oder SELECT hin? :-(
          Zuletzt geändert von MarcoCH; 29.06.2006, 21:29.

          Kommentar


          • #6
            Original geschrieben von phpaule
            Schon mit GROUP BY versucht?
            Mach bitte mit dem GROUP BY und zeig uns deine Lösung.
            ---------------------------------

            Algemein stimme ich derHund zu

            versuch deine Aufgabe mit sql zu lösen,
            mit UNION und select von jeder spalte mit distinct.

            wenn du aber weiter mit arrays machen willst
            aber verspricht, dass du UNIQUE und Vorschlag von derHund
            in Betracht ziehst
            PHP-Code:
            //nicht getestet
            $sql_spalten mysql_query("SELECT spalte1,
             spalte2, spalte3, spalte4 FROM tab_obstgemuese"
            ) or die(mysql_error());

            $ergebnis=array();
            while(
            $res_spalten =mysql_fetch_row($sql_spalten )){
               
            $ergebnis=array_merge($ergebnis,$res_spalten);
            }
            $ergebnis=array_unique($ergebnis);//jetzt muss $ergebnis unique sein
            //wenn ich natürlich keine Fehler gemacht habe 
            Slava
            bituniverse.com

            Kommentar


            • #7
              @derHund: Das hat so seine Richtigkeit. Es handelt sich um ein dynamisches CMS. Es sollen dort Kategorien eingetragen werden.
              Nein, es hat so keine Richtigkeit und es ist auch völlig egal, ob das CMS, PMS oder Progesteron ist - aber bitteschön.

              Deine zweite Methdoe scheint doch noch am einfachsten zu sein, lies alle Zeilen aus und packe die Einzelwerte alle in ein Array, dann kannst Du uniquifizieren und sortieren. Das array_merge ist falsch, nimm array_push - sortieren und uniquifizieren machst Du, nachdem die Schleife vollständig durch ist.
              dass es kein Pille-Palle-Problem ist.
              Ich enttäusche dich nur ungern, doch es ist recht banal. Dein Tabellendesign ist trotzdem total für den Hund.

              €: Siehe Slavas Vorschlag, umbrich aber bitte Deinen Code - Danke.
              Die Zeit hat ihre Kinder längst gefressen

              Kommentar


              • #8
                Das oben ist doch nur ein Beispiel. ;-)

                Es handelt sich um Keywords, die der Admin frei vergeben kann. Die Keywords sollen einzeln im Frontend ausgelesen und anklickbar gemacht werden.
                Das Skipt soll dem Admin lediglich die Arbeit abnehmen.

                Reitet bitte nicht weiter auf dem Datenbankdesign herum - Schließlich kennt Ihr das komplette Skript doch nicht. ;-)

                Kann mir sonst jemand mit einem Codeschnipsel helfen?

                @derHund: array_push hatte ich auch schon ausprobiert. Es komt folgender Fehler:
                Warning: array_push(): First argument should be an array in
                Zuletzt geändert von MarcoCH; 29.06.2006, 22:05.

                Kommentar


                • #9
                  Ich glaube, dass ich dir schon geholfen habe!
                  was funktioniert jetzt nicht?
                  Slava
                  bituniverse.com

                  Kommentar


                  • #10
                    Ich probiere gerade noch herum.

                    Kommentar


                    • #11
                      funktioniert es mit dem array?
                      so wie ich gemacht habe?

                      und wie UNION funkt kannst du hier anschauen
                      http://dev.mysql.com/doc/refman/4.0/de/union.html
                      beachte aber, dass UNION erst ab version 4 normal funktioniert
                      Zuletzt geändert von Slava; 29.06.2006, 22:17.
                      Slava
                      bituniverse.com

                      Kommentar


                      • #12
                        Es handelt sich um Keywords, die der Admin frei vergeben kann. Die Keywords sollen einzeln im Frontend ausgelesen und anklickbar gemacht werden. Reitet bitte nicht weiter auf dem Datenbankdesign herum - Schließlich kennt Ihr das komplette Skript doch nicht. ;-)
                        Wenn sich die Struktur elementar von der geposteten unterscheidet, warum hast Du dann das oben gepostet? Wozu sind die vier Spalten denn da? Pro Keyword eine Spalte? Meinst Du wirklich, das wäre sinnvoll?
                        Warning: array_push(): First argument should be an array in
                        Ja, was soll ich sagen? Mehr als 'first argument should be an array' bleibt ja nicht?

                        Auch wenns dich nicht interessiert: Mach doch eine Tabelle mit alle Keywords (und ner ID pro Key) und eine, wo Du die jeweilige Seite mit den Keys verknüpft. Nennt sich Normalisierung und ist im Bereich relationaler Datenbanken grad derbe angesagt => http://de.wikipedia.org/wiki/Normali...28Datenbank%29
                        Die Zeit hat ihre Kinder längst gefressen

                        Kommentar


                        • #13
                          Mensch Slava!!! Saubere Arbeit!!! Das klappt.

                          Es gibt nur noch ein Problem in der Ausgabe in einer Tabelle.
                          Es werden nicht alle Wörter aus der Datenbank angegeben.

                          Und kannst Du die Leerzeichen herausfiltern, die beim "Mergen" entstehen?

                          Wenn das klappt, bekommst Du per PN ein dickes-fettes Dankeschön-Geschenk! Hast mir sehr geholfen!

                          Kommentar


                          • #14
                            <<Und kannst Du die Leerzeichen herausfiltern, die beim "Mergen" entstehen?>>


                            ja, aber das mache ich nicht!
                            wenn du lehrzeichen am anfang und ende von allen array-ellementen entfernen möchtest, dann benutze function trim in einer schleife.
                            handelt es sich um die lehrzeichen in der mitte von wörter, dann kannst du auf gleiche weise str_replace anwenden

                            das muss du aber vor der array_unique erlädigen.

                            -------
                            auserdem bei mergen können keine Leerzeichen entstehen
                            Zuletzt geändert von Slava; 29.06.2006, 23:05.
                            Slava
                            bituniverse.com

                            Kommentar


                            • #15
                              Original geschrieben von MarcoCH
                              Reitet bitte nicht weiter auf dem Datenbankdesign herum - Schließlich kennt Ihr das komplette Skript doch nicht. ;-)
                              Vermutlich besser so ...
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X