PHP MySQL Suche mehrere Werte in einem Feld
-
11-10-2019 - |
Frage
Wie kann ich speichern mehrere Werte in einer einzigen SQL-Feld und gewährleisten diese Daten durchsucht werden?
Zum Beispiel möchte ich in der Lage sein, diese
zu tunname | num
-----------
John | 21, 22, 34
Mike | 41, 32, 43
Dave | 12, 23, 34
$query = SELECT name from table WHERE num = '12'
// result should be 'Dave'
oder
$query = SELECT name from table WHERE num = '22' or num = 41
// result should be John and Mike
Ich bin mit PHP, damit ich weiß, ich könnte die Daten serialisiert werden, wenn sein Sein Eingang, dann unserialize und das resultierende Array suchen, aber der Datensatz ist recht groß, so dies eine ziemlich wird langsam Abfrage, wie ich das abrufen muß gesamter Datensatz und Schleife durch das resultierende Array.
Gibt es etwas, was ich verpasst haben? Ich mag wirklich nicht eine Tabelle für jede der möglichen Optionen haben, zu erstellen, da es absolut Lasten von Gruppen und viele Optionen in jedem.
Irgendwelche Ideen? Vielen Dank im Voraus
EDIT: Das obige Beispiel ist nur ein Beispiel könnte es eine beliebige Anzahl von 'nums'
seinLösung
Sie sollten es auf diese Weise tun:
Craete ein Eintrag für jede Kombination:
John | 21
John | 22
John | 23
Mark | 19
Mark | 22
Wenn Sie irgendwelche aditional informaions in youtable 2 Tabellen erstellen:
Users:
UserId |FirstName |Lastname
1 |John |Doe
2 |Mark |Hamill
Options:
UserId |Num
1| 21
1| 22
1| 23
2| 19
2| 22
Wenn Sie eine vorhandene Datenbankstruktur zu kleben haben mit nur einer Spalte können Sie es als Text / varchar speichern. legen sie lediglich ein Rohr (oder andere Zeichen) am Anfang der Zeichenfolge und nach jeder Nummer | 21 | 21 | 23 |. Dann können Sie mit LIKE '% | 23 |%' Suche
Dies ist langsam und hässlich wie die Hölle, aber manchmal Tabellen oder aolums Zugabe ist keine Option.
Andere Tipps
Für eine optimale Geschwindigkeit und Effizienz, setzen die ‚nums‘ in einer separaten Tabelle mit den IDs verknüpft.
LIKE wird auch funktionieren jedoch es braucht auch einen Vergleich gegen einen Teil der Zeichenfolge zu tun. Je nach Größe Ihrer Daten setzt dies auch einige Zeit in Anspruch nehmen kann.
Eine weitere Option ist mysql regex Wortgrenzen dh:
SELECT name from table where nums REGEXP '[[:<:]]##[[:>:]]';
Jede dieser Optionen wird jedoch arbeiten, um die Daten in eine separate Tabelle bewegt, ist die richtige Methode vor allem, wenn es eine Menge Möglichkeiten.
Bei dieser Methode würden Sie drei Tabellen benötigen
People
-------
ID
NAME
Options
-------
ID
OPTION
Options_People
--------------
OPTION_ID
PEOPLE_ID
Um alle ‚Menschen‘ bekommen mit einer bestimmten Option ist es:
SELECT p.* FROM People p, Options_People op
WHERE p.ID = op.PEOPLE_ID and OPTION_ID = #option#
Um alle ‚Menschen‘ mit einem von mehreren Optionen:
SELECT p.* FROM People p, Options_People op
WHERE p.ID = op.PEOPLE_ID and OPTION_ID IN ( #option1#,#option2#,#option#)
Ein Name Anzahl Pivot-Tabelle ist wahrscheinlich der eleganteste Weg, um diesen
zu tunSELECT name, GROUP_CONCAT (num) FROM table_name GROUP BY name