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 tun
name | 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'

sein
War es hilfreich?

Lö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 tun

SELECT name, GROUP_CONCAT (num) FROM table_name GROUP BY name

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top