2016-08-15 3 views
1

1000+ I Reihen von SQL-Daten haben, die wie die followinng aussehenAbfrage serialisierten Daten

umeta_id | user_id | meta_key | meta_value 
433369 | 44  | all_contests | a:1:{s:12:"all_contests";a:2:{i:5011;a:1:{s:7:"entries";i:3;}i:8722;a:1:{s:7:"entries";i:3;}}} 
433368 | 63  | all_contests | a:1:{s:12:"all_contests";a:2:{i:5032;a:1:{s:7:"entries";i:3;}i:8724;a:1:{s:7:"entries";i:3;}}} 

Wenn Sie einen dieser Werte unserialize Sie ein Array erhalten wie folgt aus:

Array 
(
    [all_contests] => Array 
     (
      [5011] => Array 
      (
       [entries] => 3 
      ) 

      [8722] => Array 
      (
       [entries] => 3 
      ) 

    ) 

) 

Ich bin Es wird versucht, eine Rangliste aller Benutzer für eine bestimmte Wettbewerbs-ID zu erstellen. Der Schlüssel "all_contests" enthält ein Array mit den IDs aller Wettbewerbe, für die der Benutzer sich anmeldet. Darin sind die Einträge für den gegebenen Wettbewerb.

Die Abfrage muss alle Zeilen anzeigen, die 'all_contests' enthalten, und die 10 höchsten Einträge für eine gegebene Wettbewerbs-ID finden.

Ich bin nicht einmal sicher, dass es möglich ist, zuverlässig in einem Stück serialisierten Daten die Art zu suchen, auf die ich schaue.

+1

Oh Junge. Dies zeigt perfekt, wie das Speichern von Daten als serialisierte Arrays macht es unmöglich, diese Daten aus einer SQL-Abfrage – RiggsFolly

+0

NUTZEN Sie müssen die Zeilen auswählen, die Sie interessiert sein und dann 'unserialize() 'diese Daten in PHP und dann herausfinden, was Sie möchte mit jeder Zeile zu tun und wahrscheinlich ein weiteres Array von Daten erstellen, die Sie dann verarbeiten können, um die Informationen zu erhalten, die Sie benötigen – RiggsFolly

Antwort

1

Nein, es ist unpraktisch, innerhalb eines Stücks serialisierter Daten zu suchen.

Sie können es mit genug sorgfältigen Verwendung von MySQL String Functions wie INSTR() tun, SUBSTR(), FIELD(), und so weiter. Das Erstellen von Abfragen ist jedoch zeitaufwändig, um die Abfrage zu entwickeln, und es wird keine gute Leistung haben.

Was Sie tun, ist eine Variation eines häufigen Fehlers: Speichern einer durch Kommas getrennten Liste in einer Spalte einer Tabelle.

Dies vermeidet die Erstellung der Schnittstellentabelle, um eine Viele-zu-Viele-Beziehung darzustellen. Mit anderen Worten, Sie haben zwei Tabellen für Benutzer und Wettbewerbe, und Sie benötigen eine dritte Tabelle, in der jede Zeile die Teilnahme eines Benutzers an einem Wettbewerb darstellt.

Siehe meine Antwort auf Is storing a delimited list in a database column really that bad? Die Antwort ist über komma-getrennte Listen, aber es gilt gleichermaßen für serialisierte Arrays wie Sie tun.

+0

Bill fyi http://Stackoverflow.com/q/38998297 Entschuldigung für den Ping: p – Drew

+0

Vielen Dank für Ihre Eingabe Ich werde mein Modell anpassen. –

Verwandte Themen