jan: Abfrage mit TeilSchlüsseln in verschiedenen Arrays

Will ein paar Daten anhand eines Primärschlüssels aus der Datenbank abfragen. Der Schlüssel setzt sich aber aus 2 Arrays zusammen. Also der erste Teil des ersten Schlüssel steht beispielsweise an der ersten Stelle des Array a und der zweite Teil des ersten Schlüssel an der ersten Stelle von Array b.

Wie kann ich also am besten die SQL Abfrage schreiben? Hab in einer Schleife die Query zusammengebaut. Aber das gibt ne ziemlich lange WHERE-Klausel und ist scheinbar recht langsam. Gibts da ne bessere Möglichkeit?

Mal ein Beispiel falls das oben nicht so verständlich ist:

Also ich hab ein Array a mit dem Inhalt:

a1
a2
usw

und ein Array b mit dem Inhalt

b1
b2
usw

Brauch ne Abfrage die das macht:
 SELECT * FROM Tabelle WHERE (feldA = a1 AND feldB = b1) OR (feldA = a2 AND feldB = a2) OR ...

  1. Sup!

    Vielleicht bastelst Du die beiden Arrays zusammen, so dass ein Array (a[0]b[0], a[1]b[1], a[2]b[2]...) entsteht, und benutzt dann "IN" in der where-clause?

    Und warum sind diese Schlüssel-Arrays nicht auch Tabellen in der Datenbank? Das würde die ganze Abfrage total vereinfachen.

    Gruesse,

    Bio

    --
    Never give up, never surrender!!!
    1. Sup!

      Vielleicht bastelst Du die beiden Arrays zusammen, so dass ein Array (a[0]b[0], a[1]b[1], a[2]b[2]...) entsteht, und benutzt dann "IN" in der where-clause?

      Und warum sind diese Schlüssel-Arrays nicht auch Tabellen in der Datenbank? Das würde die ganze Abfrage total vereinfachen.

      Gruesse,

      Bio

      Zu deinem ersten Vorschlag: Geht das mit IN? Weil wüsste nur wie dass mit einem Feld geht. Oder wie sieht das dann aus? "WHERE feldA, feldB IN '$neues Array'"?

      Und was meinst du mit Tabellen in der Datenbank? Also jedes Array ist ja eine Spalte in einer Tabelle. Das ist praktisch ein zusammengesetzter Schlüssel. Das müsste doch eigentlich oft vorkommen?

      1. Servus

        Und was meinst du mit Tabellen in der Datenbank?

        Du weisst, was Tabellen sind? Bio meinte sicherlich, dass du dein Datenbankmodell entsprechend normalisiert designen (hättest sollen) sollst.

        Also jedes Array ist ja eine Spalte in einer Tabelle.

        Wie meinen? Du meinst, eine Spalte (in einem Datensatz) enthält ein Array von Werten? Also z.b. "1, 5, 8, 23"?  Das wäre grundsätzlich miserables Design. (Es gibt durchaus ganz spezielle Spezialfälle für solches Design)

        Das ist praktisch ein zusammengesetzter Schlüssel.

        Definiere bitte was du unter "zusammengesetzter Schlüssel" verstehst.

        Das müsste doch eigentlich oft vorkommen?

        Was genau?

        "WHERE feldA, feldB IN '$neues Array'"?

        Was willst du damit genau ausdrücken? Dass sowohl feldA als auch feldB in dem Array vorkommen sollen, oder dass eines von beiden reicht?

        Ich habe gerade nochmals dein Ausgangsposting gelesen. Erster Eindruck: ganz schlecht durchdachtes Datenbankmodell. Vielleicht solltest du etwas mehr Klarheit hineinbringen:

        • wie sieht deine Tabelle aus
        • Beispiel-Datensätze
        • wie soll das nochmal genau mit den Arrays funktionieren
        • wie soll das Ergebnis aussehen (eingabewerte -> ausgabe)

        Gruss
        Frank

        1. Also hier mal als Beispiel:

          Tabelle1:

          land | jahr | daten1
          ---- |----- |-------
          GER  | 1999 |...
          GER  | 2000 |...
          IT   | 1999 |...

          die felder land und jahr zusammengesetzt sind dann der schlüssel (und sind noch andere daten drin, die hier aber nicht wichtig sind)

          Tabelle2:

          land | jahr | daten2
          ---- |----- |-----
          GER  | 1999 |...
          GER  | 2000 |...
          IT   | 1999 |...

          hat dann den gleichen zusammengesetzten Schlüssel.

          So jetzt geb ich beispielsweise alle "daten1" aus Tabelle1 aus und man kann sich die gewünschten Zeilen auswählen (sind ja dann eindeutig durch den Schlüssel bestimmt). Dann soll man zur nächsten Seite kommen und die entsprechenden Zeilen (daten2) aus Tabelle2 sollen ausgegeben werden. Die also den gleichen Key haben (zusammengesetzt aus land und jahr) wie die ausgewählten Zeilen in Tabelle1

          Hoffe ihr versteht was ich meine

          Servus

          Und was meinst du mit Tabellen in der Datenbank?
          Du weisst, was Tabellen sind? Bio meinte sicherlich, dass du dein Datenbankmodell entsprechend normalisiert designen (hättest sollen) sollst.

          Also jedes Array ist ja eine Spalte in einer Tabelle.
          Wie meinen? Du meinst, eine Spalte (in einem Datensatz) enthält ein Array von Werten? Also z.b. "1, 5, 8, 23"?  Das wäre grundsätzlich miserables Design. (Es gibt durchaus ganz spezielle Spezialfälle für solches Design)

          Das ist praktisch ein zusammengesetzter Schlüssel.
          Definiere bitte was du unter "zusammengesetzter Schlüssel" verstehst.

          Das müsste doch eigentlich oft vorkommen?
          Was genau?

          "WHERE feldA, feldB IN '$neues Array'"?
          Was willst du damit genau ausdrücken? Dass sowohl feldA als auch feldB in dem Array vorkommen sollen, oder dass eines von beiden reicht?

          Ich habe gerade nochmals dein Ausgangsposting gelesen. Erster Eindruck: ganz schlecht durchdachtes Datenbankmodell. Vielleicht solltest du etwas mehr Klarheit hineinbringen:

          • wie sieht deine Tabelle aus
          • Beispiel-Datensätze
          • wie soll das nochmal genau mit den Arrays funktionieren
          • wie soll das Ergebnis aussehen (eingabewerte -> ausgabe)

          Gruss
          Frank

          1. Hallo,

            ja, jetzt wird mir zumindest langsam etwas klarer, was du möchtest. Auf der ersten Seite darf der Benutzer dann mehrere Datensätze auswählen?!

            Da kann ich grad heraus sagen: Der zusammengesetzte schlüssel aus Land und Jahr ist an dieser Stelle sub-optimal. :)  Erzeuge einen einzelnen Identifier (z.b. Land + Jahr zusammen: "GER1999") pro Record (!! in beiden Tabellen !!). Einen Unique Constraint über Land und Jahr kannst du ja behalten bzw. trotzdem haben. Dann hast du nur einen Wert von Seite 1 zu Seite 2 zu übergeben und kannst ganz problemlos ein IN verwenden. (Das waren schon wieder viel zu viel Tipps! ;))

            Eine andere Variante wäre du machst ein UNION Select für jedes übergebenes Wertepaar, also quasi

            SELECT daten1 FROM tabelle2 WHERE Land=$Land1_von_Seite1 AND Jahr=$Jahr1_von_Seite1
            UNION
            SELECT daten1 FROM tabelle2 WHERE Land=$Land2_von_Seite1 AND Jahr=$Jahr2_von_Seite1
            UNION
            SELECT daten1 FROM tabelle2 WHERE Land=$Land3_von_Seite3 AND Jahr=$Jahr3_von_Seite1
            UNION
            ...

            Das kannst du dann in PHP mit einer Schleife zusammen bauen, ein String-Template nehmen, in welchem du dann die Werte ersetzt.

            Und bitte kein TOFU!!!

            Ciao, Frank

  2. Vielleicht wirds klarer wenn ich mein ganzes Problem mal schilder: Also ich habe eine Ausgabe von verschiedenen Zeilen einer Tabelle. In der man einzelne Zeilen anklicken kann und auf der nächsten Seite sollen dann anhand der Schlüssel der angeklickten Zeilen (Schlüssel setzt sich aus mehreren Feldern zusammen) aus einer anderen Tabelle (mit gleichem Schlüssel) die entsprechenden Daten ausgegeben werden.

    Will ein paar Daten anhand eines Primärschlüssels aus der Datenbank abfragen. Der Schlüssel setzt sich aber aus 2 Arrays zusammen. Also der erste Teil des ersten Schlüssel steht beispielsweise an der ersten Stelle des Array a und der zweite Teil des ersten Schlüssel an der ersten Stelle von Array b.

    Wie kann ich also am besten die SQL Abfrage schreiben? Hab in einer Schleife die Query zusammengebaut. Aber das gibt ne ziemlich lange WHERE-Klausel und ist scheinbar recht langsam. Gibts da ne bessere Möglichkeit?

    Mal ein Beispiel falls das oben nicht so verständlich ist:

    Also ich hab ein Array a mit dem Inhalt:

    a1
    a2
    usw

    und ein Array b mit dem Inhalt

    b1
    b2
    usw

    Brauch ne Abfrage die das macht:
    SELECT * FROM Tabelle WHERE (feldA = a1 AND feldB = b1) OR (feldA = a2 AND feldB = a2) OR ...