Bogus: brauche hilfe bei sehr komplexer 'sort' syntax

hallo Perl profis,

ich suche dringend jemanden der mir ein wenig hilfe beim erstellen einer sehr komplexen sort syntax geben kann.

die suchergebnisse sollen sortiert werden.
datenbank (kurzversion) mit:
Feld:Kommerziell Wert:Ja oder Nein
Feld:Preis       Wert:Zahl
Feld:Aktion      Wert:Suche, Biete oder Tausche
Feld:PLZ         Wert:Zahl

zb soll zuerst nach Aktion sortiert werden (also suche, biete oder tausche), dann nach kommerziell oder nicht, und dann noch PLZ oder Preis

soviel nur damit ihr euch vorstellen könnt in welche richtung das ganze läuft.
mal sehen ob es hier im forum profis gibt die soetwas drauf haben - ich geb nach einem tag auf :-(

danke schon jetzt
cu
Bogus

  1. die suchergebnisse sollen sortiert werden.
    datenbank (kurzversion) mit:
    Feld:Kommerziell Wert:Ja oder Nein
    Feld:Preis       Wert:Zahl
    Feld:Aktion      Wert:Suche, Biete oder Tausche
    Feld:PLZ         Wert:Zahl
    zb soll zuerst nach Aktion sortiert werden (also suche, biete oder tausche), dann nach kommerziell oder nicht, und dann noch PLZ oder Preis

    Bist Du sicher, daß Perl das richtige Werkzeug für das Problem ist?
    Wenn Deine Datenbank ihren Namen verdient, dann kannst Du da mit "order by" usw. in entsprechenden SQL-Anwendungen auch schon eine Menge erreichen.

    1. »

      Bist Du sicher, daß Perl das richtige Werkzeug für das Problem ist?
      Wenn Deine Datenbank ihren Namen verdient, dann kannst Du da mit "order by" usw. in entsprechenden SQL-Anwendungen auch schon eine Menge erreichen.

      hye michael

      danke für die antwort

      die datenbank soll eigentlich via mySQL laufen.
      aber ich hab es bis jetzt nicht einmal geschaft das DBI modul zu installieren :-(
      du hast dazu ja schon geantwortet (thnx auch dafür); DBI muss laut readme ge'make'd werden.

      wenn ich das aber wie in der readme beschrieben mit
      perl Makefile.pl mache, dann bricht er ab. mit der gleichen fehlermeldung die ich auch beim ausführen eines perl scripts mit DBI-zugriff erhalte.

      in der DBI.pm steht in der zeile in der abgebrochen wurde....'wenn diese fehlermeldung erscheint, wurde das modul nicht richtig installiert'..blabla

      natürlich will ich meine datenbank mit sql erstellen. aber ich kann keine sql syntax erlernen, wenn ich sql nicht mal am localhost zum laufen bringen :-(

      es muss doch irgendwo ne anleitung geben, wie ich mysql unter win32 mit perl einsetzte....ohne kompiller! mit den links zu downloadmöglichkeiten der benötigten files.

      naja, zur frage zurück: bis ich mich mit den sql suchfunktionen auskenne, wird wohl noch ne zeit vergehen, deshalb versuche ich das ganze im moment so zu lösen. zur info: die suche soll sowieso mittels perl (zumindest online) erfolgen, nur die sortierung übernimmt aktuell noch das script selbst....ziemlich komplexe angelgenheit.

      vielleicht kannst du oder jemand anders mir ja weiterhelfen.
      thnx
      Bogus
      thnx

      1. natürlich will ich meine datenbank mit sql erstellen. aber ich kann keine sql syntax erlernen, wenn ich sql nicht mal am localhost zum laufen bringen :-(

        Das halte ich für die falsche Einstellung zum Thema. Du mußt Dich doch nicht gleich mit allen Problemen auf einmal befassen!

        Fang doch erst mal damit an, SQL zu lernen (einfache Abfragen sind nicht so arg schwierig).
        Irgend ein Programm, mit dem Du SQL-Statements gegen Deine Datenbank (hat die überhaupt schon Tabellen und Inhalte drin?) werfen und die Ergebnisse ansehen kannst, wird ja wohl mitgeliefert worden sein.

        Wenn Du das kannst, dann kommt als nächstes die Einbindung in eine Programmiersprache. Ich weiß nichts über ODBC oder so ein Zeug, aber irgendwie wirst Du Deine SQL-Anwendungen an die API der Datenbank weiterreichen und die Ergebnisse in Variablen aufsammeln müssen.
        Diese Ergebnisse kannst Du dann sortieren und nach stdout ausgeben. Das alles läßt sich prima offline testen.

        Und erst danach machst Du die CGI-Einbindung: http-Header ausgeben, CGI-Parameter parsen (deren Werte waren während Phase 2 fest eingebrannt), Ausgabe ggf. in HTML formatieren (obwohl ASCII zunächst auch reicht), und die Webserver-Konfiguration CGI-tauglich machen.

        Zuallerletzt kommt dann Performance-Tuning und schönes Layout in HTML.

        Rom wurde auch nicht an einem Tag erbaut - Dein Problem ist komplex genug, Dich für einige Wochen auf Trab zu halten ...

        1. Rom wurde auch nicht an einem Tag erbaut - Dein Problem ist komplex genug, Dich für einige Wochen auf Trab zu halten ...

          hye,

          FERTIG :-)
          vielleicht hab ich es noch nicht erwähnt, aber mit dem erlernen von neuen sprachen hab ich überhaupt keine probleme.

          nachdem ich (danke nochmal an Jörk) entlich die richtigen DBI und DBD module von activestate runterladen konnte, funktioniert auf einmal auch das installieren via ppm (perl package mangaer). naja, obwohl ich noch nie mit ppm gearbeitet habe funktionierten die module nach dem ersten versuch *grins*

          einen grundriss, wie ich die suche coden muss (in perl) hatte ich anhand einer datei die für mSQL geschrieben war. auuser SELECT, FROM und WHERE funtionierte mit mySQL zwar nichts, aber dank 'phpMyAdmin' und einiger mini-dokus zu mysql, kamm ich nun innerhalb eines tages zu einem ergebniss :-)

          so bin ich mir jetzt zumindest über
          SELECT, FROM, WHERE, AND, OR, BETWEEN, IN, LIKE, ORDER
          im klaren. auch das erstellen einer tabelle und hinzufügen von daten hab ich schon intus. alles was ich noch brauchen werde, werd ich lernen wenn es soweit ist.

          ...rom ist wohl doch grösser als mein projekt :-)
          ich hab ja nur in 2 tagen mySQL, Apache Server und PHP3 installiert und erlernt (zum teil).

          </eigenlob>
          cu
          Bogus

          1. FERTIG :-)
            kam ich nun innerhalb eines tages zu einem ergebniss :-)
            ich hab ja nur in 2 tagen mySQL, Apache Server und PHP3 installiert und erlernt (zum teil).
            </eigenlob>

            Fein. Dann hast Du ja den Rest der erwähnten Wochen Zeit dafür, Dein Projekt auf ein stabiles Betriebskonzept zu stellen und ordentlich zu dokumentieren.
            (Nicht, daß man später sagen wird: "Ein Bad? Wozu das denn? Die 'vorläufig endgültige' Lösung mit dem Klohäuschen im Garten hat sich doch prima bewährt." ;-)

  2. die suchergebnisse sollen sortiert werden.
    datenbank (kurzversion) mit:
    Feld:Kommerziell Wert:Ja oder Nein
    Feld:Preis       Wert:Zahl
    Feld:Aktion      Wert:Suche, Biete oder Tausche
    Feld:PLZ         Wert:Zahl

    zb soll zuerst nach Aktion sortiert werden (also suche, biete oder tausche), dann nach kommerziell oder nicht, und dann noch PLZ oder Preis

    Heyho,

    solltest Du in jedem Feld eine "normale" Sortierung, d.h entweder ab- oder aufsteigend wollen, sieht der SQL-String ungefähr so aus

    Aufsteigende Sortierung:
    SQL = "SELECT * FROM tblEins ORDER BY Aktion, Kommerziell, PLZ, Preis;"

    Absteigende Sortierung:
    SQL = "SELECT * FROM tblEins ORDER BY Aktion DESC, Kommerziell DESC, PLZ DESC, Preis DESC;"

    Soweit so gut.
    Solltest Du im Feld Aktion eine beliebige Sortierung wünschen (nicht nach dem Alphabet), wäre eine extra Tabelle, in der die Begriffe definiert sind, eher geeignet.

    Dafür legt man eine neue Tabelle mit fogender Struktur  an:
    Index   -> Zahl (Primärschlüssel)
    Text    -> Text
    Sortpos -> Zahl

    Jetzt kannst Du zuerst mal dem Text eine Position innerhalb der Sortierung angeben.
    Diese Tabelle wird dann als Grundlage für den eigentlichen Wert der Haupttabelle benutzt.
    In Deiner Haupttabelle mußt Du das Feld Aktion jetzt noch in eine Zahl eingeben.

    Der SQL-String (erschlag mich nicht, wenn ich einen Dreckfuhler drinhabe) sieht dann so aus.

    SELECT tblEins.*, tblZwei.* FROM tblEins INNER JOIN tblZwei ON tblEins.Aktion = tblZwei.Index ORDER BY tblZwei.Sortpos;"

    SQL-Datenbanken handeln sowas normalerweise ohne Probleme.
    MySQL kenne ich nicht, aber ich habe noch keine Datenbank gesehen, die sowas nicht kann.

    Tschau, Stefan

    1. hye profi :-)

      solltest Du in jedem Feld eine "normale" Sortierung, d.h entweder ab- oder aufsteigend wollen, sieht der SQL-String ungefähr so aus

      du scheinst dich ja gut auszukennen.
      kennst du dann evtl. auch ne gute deutsche doku?

      AURUF: mach mal einer selfSQL :-)

      zurück zur frage: du hast die sortierung mittels sql beschrieben. wie wende ich das in verbindung mit einer suche an? sprich: zuerst wird nach einem begriff gesucht, und die ergebnisse dann sortiert.

      thnx, cu
      Bogus

      1. du scheinst dich ja gut auszukennen.
        kennst du dann evtl. auch ne gute deutsche doku?
        AURUF: mach mal einer selfSQL :-)

        Tja, die Sache ist ähnlich wie bei HTML: Natürlich gibt es irgendwelche SQL-Standards, aber genauso natürlich hält sich kein Schwein daran.

        Der "inner join" ist beispielsweise eine Art der Verknüpfung, die meines Wissens in "normalem" SQL gar nicht existiert (da geht das etwas anders) und deshalb in Oracle7 so nicht funktionieren würde. Wer einmal versucht hat, mit Oracle-Kenntnissen (wo wirklich viel geht, etwa Trigger und Constraints - wozu Anwendungen schreiben, wenn die Datenbank selbst intelligenten Code enthält?) eine "Datenbank" wie Access oder gar Lotus Notes (die haben nicht mal Primärschlüssel, sagt unser Lotus-Admin) zu verwenden, der erlebt einen Kulturschock.

        Außerdem gibt es sehr viel mehr Datenbankhersteller als Browserhersteller.
        selfSQL müßte sich mit unzähligen Dialekten befassen, und anders als bei HTML sieht das Ergebnis bei einer kleinen Abweichung nicht bloß unschön aus, sondern es funktioniert dann halt einfach nicht. Und es ist völlig normal, daß man dann erleben muß, sein gesamtes Datenbankdesign auf den Müll zu werfen, weil 2-3 notwendige Sprachelemente nicht vorhanden sind.
        Wer eine Datenbankanwendung baut, muß sich letztlich auf die konkrete Datenbank einstellen. Es schadet nichts, wenn man Standards kennt und beachtet, aber es nützt auch nicht sehr viel - vor allem wenn nicht von vornherein die Anforderung besteht, portabel zu sein.

  3. Hi Bogus!

    die suchergebnisse sollen sortiert werden.
    datenbank (kurzversion) mit:
    Feld:Kommerziell Wert:Ja oder Nein
    Feld:Preis       Wert:Zahl
    Feld:Aktion      Wert:Suche, Biete oder Tausche
    Feld:PLZ         Wert:Zahl

    Mal abgesehen davon, daß man die Sortiererei direkt in die Abfrage mit einbauen sollte, läßt
    sich das sicher auch gut mit Perl sortieren. Dabei fragt sich dann aber erstmal, wie denn wohl
    die Werte der Abfrage vorliegen. Normalerweise würde man solche Werte wohl in einem Hash
    vergraben und die ganze Abfrage in ein Array (bzw. die Referenzen auf die Hashes). $Ergebnis[5]->{'Preis'} bringt dann den Preis des 6. Datensatzes.
    Zum sortieren nimmt man sort und übergibt eine Funktion, die die Vergleiche vornimmt. Innerhalb der Funktion sind $a und $b (in unserem Beispiel Hash-Referenzen) zu Vergleichen:

    sort {$a->{'Kommerziell'} cmp $b->{'Kommerziell'}
          $b->{'Aktion'} cmp $a->{'Aktion'}
          $b->{'Preis'} <=> $a->{'Preis'}
          $a->{'PLZ'} <=> $b->{'PLZ'} } @Ergebnis;

    Jörk

    Für die DBI Module unter Windows solltes Du mal auf der Active-State Site nachschauen. Die
    haben dort entsprechen angepaßte Module liegen, die mit dem Paket-Manager PPM zu installieren sind:
    http://www.activestate.com/packages/zips/

    1. hye

      Mal abgesehen davon, daß man die Sortiererei direkt in die Abfrage mit einbauen sollte, läßt
      sich das sicher auch gut mit Perl sortieren.

      will ich ja auch :-)

      Dabei fragt sich dann aber erstmal, wie denn wohl

      die Werte der Abfrage vorliegen. Normalerweise würde man solche Werte wohl in einem Hash

      die werte sind sehr umständlich gespeichert!

      ein $hash{$xyz} enthällt eine liste@ mit den daten zu einem datensatz. beispiel $hash{'datensatz1'} = @liste (mit allen datenfeldern zu einem datensatz)

      das bedeuted das in %hash die listen der datensätze abgelegt sind. da wirds ein wenig kompliziert....für mich zumindest

      da du dich anscheinend gut damit auskennst, wäre es toll wenn ich dir mal ein paar genauere daten mailen könnte, und du mir evtl. bei der lösung helfen könntest.

      http://www.activestate.com/packages/zips/

      danke, ich werd es probieren!