Mysql nach Array selectieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
code
datensatz
datum
dynamische anzahl
feste statische tabelle
festlegen
frage
joint
problem
referenz
spalten
speichern
tabelle
text
ungenutzte spalten
url
werte speichern
zahl
zeile
-
Hi,
Ich habe ein etwas komplizierteres Problem und ich weiss auch garnicht ob man das so einfach lösen kann.
Ich habe eine Mysqltabelle mit zB 3 Spalten.
Spalte1: Text
Spalte2: Zahl
Spalte3: Text;Text2;Text3;Text4
die 1. und 2. SPalte sind ganz normal mit Text oder Zahlen gefüllt. In der 3. Zeile sind aber unterschiedlich viele Texte durch ein Semikolion ';' voneinander getrennt.
Kann ich jetzt folgenda Abfrage durchführen?
SELECT FROM tabellenname WHERE Spalte3 enthält text2
Wie frage ich danach? Oder ist das so nicht sinnvoll bzw. Sollte ich lieber gleich ein Array speichern und dann fragen oder so?
Vielen Dank & MFG -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ungetestet und ohne Garantie:
SELECT * FROM tabelle WHERE spalte3 LIKE '%text2%'
Aber eigentlich sollte man solche Datenbankstrukturen vermeiden, und für jeden Eintrag einen eigenen Datensatz anlegen...
Beitrag zuletzt geändert: 6.7.2011 8:36:08 von alfr3d -
Vielen Dank.
Ja, wegen der Datenstruktur. Es ist ja wie gesagt eine unterschiedliche Menge. Und eine feste Spaltenanzahl geht dann ja nicht.
Oder gibt es da eine andere Lösung die etwas schicker ist?
MFG -
SELECT * FROM tabelle WHERE MATCH (`spalte3`) AGAINST ('text2*' IN BOOLEAN MODE)
Ich würds so machen. Ich bin aber noch nicht wach genug... ^^ Aber das dürfte schneller sein, als LIKE.
EDIT:
Ein Sternchen zu viel
Beitrag zuletzt geändert: 6.7.2011 9:12:49 von fabo -
Die Daten sind nicht atomar, das ist sehr unschön. Zur Behebung bietet sich eine weitere Tabelle an, die die momentan noch "zusammengeklebten" Werte als einzelne Datensätze aufnimmt. Über einen Fremdschlüssel kann man dann festlegen, zu welchem Datensatz der Haupttabelle sie gehören.
-
Ja eben nicht. Wenn ich jetzt 7 Werte mit ';' getrennt habe, dann braucht die andere Tabelle doch 7 spalten für jeden Wert eine.
Wenn ich aber jetzt 1000 Werte habe, dann sind 7 zu wenig, bzw bei 1000 Spalten wären 993 ungenutzte Spalten, wenn ich darin nur 7 werte speichern würde. Mein Problem ist, dass ich unterschiedlich viele werte, also eine dynamische Anzahl in eine feste, statische Tabelle reinpacken möchte.
MFG -
programtools schrieb:
Ja eben nicht. Wenn ich jetzt 7 Werte mit ';' getrennt habe, dann braucht die andere Tabelle doch 7 spalten für jeden Wert eine.
Wenn ich aber jetzt 1000 Werte habe, dann sind 7 zu wenig, bzw bei 1000 Spalten wären 993 ungenutzte Spalten, wenn ich darin nur 7 werte speichern würde. Mein Problem ist, dass ich unterschiedlich viele werte, also eine dynamische Anzahl in eine feste, statische Tabelle reinpacken möchte.
MFG
Du darfst pro Datensatz nur einen Text speichern. Und dann wie deddyh schon gesagt hat, über einen Fremdschlüssel festlegen zu welchem Datensatz er gehört. Wenn du also 7 "Texte" hast, legst du einfach 7 Datensätze an, und bei 1000 eben 1000...
Beitrag zuletzt geändert: 7.7.2011 10:09:02 von alfr3d -
Was deddyh und alfr3d sagen wollen, ist Folgendes:
Tabelle1 ------------------------------------ | ID | Spalte2 | Spalte3 | ------------------------------------ | 1 | Text | Zahl | ------------------------------------ Tabelle2 --------------------- | Spalte1 | Spalte2 | --------------------- | Text | 1 | | Text2 | 1 | | Text3 | 1 | | Text4 | 1 | ---------------------
Die Tabelle1 enthält einen Primärschlüssel, der jede Zeile eindeutig identifiziert. In der Tabelle2 wird mit einem Fremdschlüssel auf genau diesen einen Datensatz referenziert. Bei der Abfrage machst du dann einen JOIN. Alles klar?
Beitrag zuletzt geändert: 7.7.2011 10:06:49 von wagnerm -
Haargenau. Oder etwas anders beschrieben:
/* Mastertabelle */ ID Feld1 Feld2 /* Detailtabelle */ ID Master_ID --das ist die Referenz auf die Mastertabelle Feld1 Feld2
Um nun z.B. alle Daten für den Master-Datensatz mit der ID 1 zu bekommen, joint man diese gegen die Detailtabelle
SELECT * FROM Mastertabelle M JOIN Detailtabelle D ON D.Master_ID = M.ID WHERE M.ID = 1
Als Ergebnis bekommt man dann so viele Datensätze zurück, wie in der Detailtabelle mit der entsprechenden Master_ID vorhanden sind. Falls man das lieber alles in einem Datensatz haben möchte wie im Ausgangspost, dann muss man eben auf GROUP_CONCAT zurückgreifen.
Beitrag zuletzt geändert: 7.7.2011 11:41:35 von deddyh -
Achso, sorry ich hab nicht gleich verstanden dass es sich um 2 Tabellen handelt. Ist natürlich so eine sehr saubere Variuante, auch wenn man 2 Tabellen braucht. Vielen Dank für die Hilfe, so mach ichs ;)
MFG
EDIT
Ich habe noch eine Frage.
Ich habe jetzt eine Tabelle mit den feldern code, value1 und value2 und meine schlüsseltabelle mit code und pid.
Ich habe jetzt die pid der 2. Tabelle und möchte jetzt darüber aus der 1. TAbelle value1 und value2 ausgeben (da wo in Tabelle1 code = Tabelle2 code)
Beitrag zuletzt geändert: 8.7.2011 16:44:15 von programtools -
Sofern ich Dich richtig verstanden habe:
SELECT D.value1, D.value2 FROM Mastertabelle M JOIN Detailtabelle D ON D.code = M.code WHERE M.pid = <Deine pid>
-
Super ! Vielen vielen Dank. Abfragen über mehrere Tabellen fand ich immer recht kompliziert, aber wenn man einmal das Grundprinziep verstanden hat ist es doch sehr nützlich.
Hat mir sehr geholfen. MFG -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage