Seite 1 von 1
[phpBB3] SQL Abfrage über Array mit Zahlen filtern
Verfasst: 22.03.2008 10:42
von Helmut
Hallo,
ich sitze gerade an einem Problem und komme irgendwie nicht wirklich weiter.
Ich möchte eine SQL Abfrage einer Tabelle nach den Inhalt eines Array filtern. Das Array beinhaltet z.B. mehrere Zahlen, welche durch ein Komma (25,13,39,) getrennt sind. In der Tabelle befindet sich auch eine Spalte (wert_id), welche ebenfalls eine Zahlenreihe aus einer oder mehrere Zahlen besteht wie zum Beispiel (2,13,24,).
Nun möchte ich bei der Abfrage der Tabelle wissen, ob eine der Zahlen vom Array in der Spalte wert_id befindet.
Code: Alles auswählen
$sql = 'SELECT test_id, wert_id
FROM ' . TEST1_TABLE . "
WHERE test_id = $user_id
AND wert_id = ..........
ORDER BY test_id ASC";
$result = $db->sql_query($sql);
while ($nav_data = $db->sql_fetchrow($result))
Wie muss die Abfrage dann aussehen, dass die entsprechende Zeile nur ausgegeben wird, wenn eine der Zahlen in wert_id mit irgendeiner Zahl aus dem Array übereinstimmt?
Gruß Helmut
Verfasst: 22.03.2008 11:06
von Pyramide
Das geht am besten, wenn du die Datenbank vorher normalisierst (mindestens
Erste Normalform).
Verfasst: 22.03.2008 11:32
von Helmut
Hallo Pyramide,
danke dir für die schnelle Antwort. Die Spalte wert_id ist die einzige Spalte, welche unter bestimmten Umständen auch mehrere Zahlen enthalten kann, in den meisten Fällen steht aber nur eine Zahl drinnen. Eine Aufteilung der Spalte ist nicht sinnvoll, da theoretisch auch beliebig viele Zahlen drinnen stehen könnten.
Gruß Helmut
Verfasst: 22.03.2008 12:15
von Pyramide
Helmut hat geschrieben:Eine Aufteilung der Spalte ist nicht sinnvoll, da theoretisch auch beliebig viele Zahlen drinnen stehen könnten.
Das spricht ja gerade
für die Aufteilung, da entweder die Speichermenge begrenzt ist (z.B. Varchar) oder bei noch größeren Datenmengen wie BLOB die Abfragedauer entsprechend langsam wird.
Verfasst: 22.03.2008 12:36
von Helmut
Hallo Pyramide,
ja sicher, aber ich kann doch jetzt nicht auf Verdacht z.B. 20 zusätzliche Spalten einfügen. Dann kommt irgendwann der Punkt wo ich 22 spalten bräuchte, dann kann ich wieder welche einfügen und die Abfrage anpassen.
An die Möglichkeit habe ich ja vorher schon gedacht, aber es muss doch eine andere Lösung geben, als das nur über eine Unmenge an Spalten zu lösen.
Gruß Helmut
Verfasst: 22.03.2008 15:04
von Pyramide
Hast du dir den Wikipedia-Artikel überhaupt durchgelesen? Mehrere durchnumerierte Spalten sollen ja durch die erste Normalform gerade aufgelöst werden. Im Artikel ist ja als Beispiel eine CD-Datenbank, da kann man das gut erkennen, wie das hinterher aussehen soll.
Verfasst: 22.03.2008 16:29
von Helmut
Hallo Pyramide,
klar habe ich mir den Artikel durchgelesen und ich weis auch wie das gemeint ist, aber in meinem Fall ist das nicht die wirklich gute Lösung. Die Tabelle besteht ja bereits aus fast 30 Spalten und eine davon ist eben die wert_id. In der Spalte sind ja nur Zahlen drinnen, welche die gleiche Eigenschaft haben z.B. Telefonnummer.
Wenn ich es mit zusätzlichen Spalten mache, dann wäre das genauso, als ob ich für einen Text für jedes Wort eine eigene Spalte anlegen würde, nur um hinterher die Tabelle leichter nach einem bestimmten Wort im Text zu filtern und das macht ja auch keinen Sinn.
Gruß Helmut
Verfasst: 22.03.2008 16:47
von gn#36
Was du willst ist doch im Prinzip eine m:n Beziehung (also m Werte aus dem Array sollen mit n Werten aus der DB verglichen werden, vereinfacht gesagt).
Die erste Normalform verlangt, dass du keine untrennbaren Datenfelder mehr hast und dass alle Datenfelder eine feste Breite haben. Das ist aber bei einer m:n Beziehung nicht der Fall wenn du versuchst diese in einer Tabelle unterzubringen, weil du nie weißt, wie viel Platz du dafür tatsächlich brauchst.
Das geht daher am einfachsten über eine zusätzliche Tabelle in der dann genau diese Beziehungen gespeichert werden. Wenn du in deiner Tabelle einen eindeutigen Schlüssel hast, dann kannst du diesen als eine der Tabellenspalten nutzen und eine zweite Spalte anlegen für die Werte aus dem Array. Diese Tabelle bekommt dann keinen Primärschlüssel (bzw. der Primärschlüssel liegt auf beiden Spalten zusammen um Redundanz zu vermeiden) und du fragst aus dieser Tabelle ab, welche Einträge der anderen Tabelle in Frage kommen.
Verfasst: 23.03.2008 20:36
von Helmut
Hallo gn#36,
ich habe es jetzt gelöst und zwar mit $sql_array = array(....... Damit ging es ganz gut, die Vorlage dazu habe ich mir aus der funktions_display.php abgeschaut.
Gruß Helmut