[phpBB3] SQL Abfrage über Array mit Zahlen filtern

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

[phpBB3] SQL Abfrage über Array mit Zahlen filtern

Beitrag 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
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Das geht am besten, wenn du die Datenbank vorher normalisierst (mindestens Erste Normalform).
KB:knigge
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag 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
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag 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.
KB:knigge
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag 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
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag 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.
KB:knigge
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag 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
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag 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
Ich bin nicht ganz dicht.... na und.
Antworten

Zurück zu „Coding & Technik“