Jan: SQL Abfrage

Hallo, habe ein Problem bei einer SQL Abfrage. Also ich versuch das mal zu erklären.

Ich habe ein Formular in dem mehrere Einträge markiert werden können. Jeder eintrag setzt sich auch mehreren Schlüsseln zusammen. Also zum Beispiel aus dem Schlüssel Land: "Germany" und dem Schlüssel Jahr: "1985" oder "Germany" und "1999"

Wie übergeb ich das jetzt am besten? Zusammengesetzt in einem Array oder jeder Schlüssel in einem eigenen Array? Und wie kann ich das am besten mit einer MySQL-Abfrage abfragen?

Für eine Antwort wär ich sehr dankbar, da ich mir da schon länger den Kopf drüber zerbrech.. :)

  1. yo,

    von datenbankseite her kommt es drauf an, ob die kriterien alle zutreffen sollen oder einer reicht. je nachdem musst du den Operator OR oder AND verwenden in der SQL Anweisung.

    Ilja

    1. yo,

      von datenbankseite her kommt es drauf an, ob die kriterien alle zutreffen sollen oder einer reicht. je nachdem musst du den Operator OR oder AND verwenden in der SQL Anweisung.

      Ilja

      Sollen alle zutreffen. Das ist ja das Problem. Ansonsten könnt ich ja mit zwei mit AND verknüpften IN Operationen die Abfrage machen...

      1. yo,

        ich verstehe dein problem noch nicht ganz. wenn alle angaben zutreffen sollen, dann verbindest du eben alles mit dem operator AND. wenn nur innerhalb von den gruppen alles zutreffen soll, dann verbindest du alles innerhalb der gruppen mit AND und die gruppen fügst du dann mit OR zusammen. das geht sogar ohne klammern, da and stärker als OR bindet.

        von der sql abfrage sehe ich keine probleme, fragt sich nur, was genau du meinst. versuch es mal anhand von guten beispiel darzulegen.

        Ilja

        1. yo,

          ich verstehe dein problem noch nicht ganz. wenn alle angaben zutreffen sollen, dann verbindest du eben alles mit dem operator AND. wenn nur innerhalb von den gruppen alles zutreffen soll, dann verbindest du alles innerhalb der gruppen mit AND und die gruppen fügst du dann mit OR zusammen. das geht sogar ohne klammern, da and stärker als OR bindet.

          von der sql abfrage sehe ich keine probleme, fragt sich nur, was genau du meinst. versuch es mal anhand von guten beispiel darzulegen.

          Ilja

          Also als beispiel, wenn ich nur einen wert habe ist das ja kein Problem. Dann hab ich z.b ein Array mit folgenden werten:

          "Germany"
          "France"
          "Spain"

          das kann ich ja dann zu einem String verbinden und in der SQL Abfrage dann so abfragen: "... WHERE land IN ('$string')

          Wenn ich aber jetzt zwei Werte habe

          "Germany" "1999"
          "France"  "1998"
          "Spain"   "1997"

          und jedes Jahr zu einem Land gehört und ich also zwei Arrays habe und ich das ganze dann so abfrage: "... WHERE land IN ('$string1') AND year IN ('$string2')"

          dann würde ja auch der Eintrag "Germany 1998" z.b ausgegeben..

          1. Hi,

            du möchtest also quasi eine Schnittmengenabfrage machen?

            Pseudocode, der dir möglicherweise zur Selbsfindung verhilft. "Id" sei mal der Primärschlüssel der Tabelle

              
            SELECT Id, Land, Jahr, weitereFelder  
              FROM MeineTabelle LaenderKriterium  
              INNER JOIN MeineTabelle JahrKriterium  
                ON LaenderKriterium.Id = JahrKriterium.Id  
              WHERE LaenderKriterium.Land IN ('deineLaenderListe')  
              AND JahrKriterium.Jahr IN ('deineJahresListe')  
            
            

            Du erstellst einfach also zwei Ergebnismengen und vergleichst sie auf die beinhalteten Primärschlüssel.

            Ciao, Frank

          2. yo,

            "Germany"
            "France"
            "Spain"

            das kann ich ja dann zu einem String verbinden und in der SQL Abfrage dann so abfragen: "... WHERE land IN ('$string')

            der IN Operator ist eine logische oder verbindung in kurzschreibweise. ich hoffe, in deinem string steht so was drinne, das dies herauskommt:

            IN ('Germany', 'France', 'Spain')

            da der IN operator nicht prüft, ob innerhalb EINES strings ein bestimer wert drinne steht, wäre dies falsch:

            IN ('GermanyFranceSpain')

            Wenn ich aber jetzt zwei Werte habe

            "Germany" "1999"
            "France"  "1998"
            "Spain"   "1997"

            dann musst du in etwa sowas bauen, je nachdem welche logik du erzeugen willst:

            where spalte_land = 'Germany' AND spalte_jahr = 1999
            OR spalte_land = 'France' AND spalte_jahr = 1998
            spalte_land = 'Spain' AND spalte_jahr = 1997

            am besten sind immer beispielwerte was in der datenbank steht und welche werte du davon haben willst.

            Ilja