SQL-Abfrage mit Splitt Array und anschließender Auswahl

:morgen:

es geht um folgendes: ich möchte freundeslisten erstellen, die anzeigen ob der „freund“ den auch online ist, dazu hab ich eine freundesliste in form eines strings in einer datenbank der davor ausgelesen wird, gesplittet und in ein array geschrieben wird. Jetzt möchte ich mit diesem Array Datensätze aus der Datenbank auslesen nämlich einen datetime, die abfrage könnte ganz simple sein also so das jeder wert aus dem array einmal abgerufen wird und die entsprechenden felder also einen zeitstempel mit ausliest, aber ich weis leider nicht wie ich eine sql abfrage mit einem array schreibe. desweiteren weis ich nicht, wie man das ergebnis der sql abfrage dann wieder in ein array schreibt und das array dann gleich noch überprüft, also in etwa so „Falls bedingung erfüllt schreibe datensatz in array eins wenn nicht in array 2“ wie die abfrage auszusehen hat weis ich leider auch nicht, ich hoffe ihr könnt mir da weiterhelfen, entschuldigt meine miese textgestaltung, aber hab heut schon so viel geschrieben, hab langsam keine lust mehr :ps:

Das ist suboptimal.
Beschaeftige dich mit dem Stichwort Normalisierung.

Gar nicht.
Aber die Datenbank kennt Operatoren wie IN()

Schleife ueber Ergebnisdatensaetze, jeden Datensatz als neues Array-Element einfuegen.

Ich auch nicht, weil du ja nicht beschreibst, was du eigentlich abfragen moechtest.

Aber ein simples

WENN (bedingung) DANN { fuege ein neues Element in Array1 ein } SONST { fuege ein neues Element in Array2 ein }
wirst du doch wohl noch hinbekommen …?

Also ja, eine if-Bedingung bekomm ich noch selber hin…
Und ja das Array und die Datenbankabfrage auch, aber wie überprüf ich das array?
ich kenn nur in_array() aber das hilft mir nichts, ich will ja zwei datetime werte mit einer < bzw > abfragen

Sorry, ich verstehe nicht, wo dein Problem liegt.

Mal etwas genauer und etwas weniger konfus bitte.

Du kannst keine Arrays als solche abspeichern. Wenn du deinen Denkansatz weiterverfolgen willst, solltest du dir mal serialize() und unserialize(), bzw. (ehr suboptimal) implode() und explode() angucken.

Also ich versuchs nochmal deutlich zu machen: :ps:

Ich habe eine Tabelle, aus der les ich jetzt vereinfacht dargestellt einen relevanten Datensatz aus:

$sql = "SELECT friends FROM user WHERE id = '$id'";
...

Jetzt hab ich einen String der aus Zahlen und Trennungszeichen besteht:

$string = "1:24:78:2:30"
$friends = explode(':',$string);

Jetzt hab ich ja in $friends ein Array mit Zahlen, dieses möchte ich nun in der nächsten SQL-Abfrage verwenden… so in etwa?

for ($x = 0; $x < sizeof($friends); $x++)	{
$sql = "SELECT username, lastaction FROM user WHERE id = ".$friends[$x];
...
$friendname[$x] = $username;
$friandlasta[$x] = $lastaction;
next($friends);

Wär der code bis dahin richtig? Wenn ja gut, aber beim nächsten Schritt müsste ich nun passen, denn ich will jetzt überprüfen ob der wert in „$friendlasta“ < bzw. > time()-180 ist, und jenachdem was das ergebnis ist soll der Wert aus „$friendname“ der zu dem entsprechenden eintrag aus „friendlista“ gehört in $array1 bzw $array2 geschrieben werden und dann am besten wenn da abgeschlossen ist die arrays alphabetisch sortiert werden o.O aber ich hab leider kein schimmer wie ich das anpack…

Dass gerade dieser Punkt deines Datenmodells dringend der Ueberarbeitung bedarf, schrieb ich bereits.

Nein, bloss nicht - Abfragen in Schleifen abzufeuern, ist i.a.R. so ziemlich das unguenstigste, was man machen kann.

Auf einen passenden Operator wies ich dich ebenfalls bereits hin.

Also eine recht simple IF-Abfrage - die du laut eigener Aussage selbst hinbekommen wuerdest.
Wenn doch nicht - dann musst du schon mal zeigen, wo’s hakt.

Sortieren kann die Datenbank bereits sehr gut; und wenn du eine sortierte Menge durchlaeufst und dabei in zwei Teilmengen aufteilst, dann geht dir die Sortierung dabei auch nicht verloren.

Dass gerade dieser Punkt deines Datenmodells dringend der Ueberarbeitung bedarf, schrieb ich bereits.[/quote]

Wie sollte ich es deiner Meinung nach lösen? Ich hatte das mal über eine Tabelle geregelt, wo jeder Friendeintrag via nutzerid und friendid eingetragen wurde, aber die datenbank umfasst dann halt bald mehrere hundert bzw tausend einträge in der aktuellen version sind es so 600… ich finde das sehr unschön, hätte die eintrage lieber alle in einem feld stehen…

Anstelle von explode kannst du doch serialize nehmen :wink:

Meinst du sowas?

$sql = "SELECT * WHERE id='" . $id[0] . "' OR id='" . $id[1] . "' ... ";

Ähm nein, das mein ich glaub nicht, ich will einfach das die SQL-Abfrage mit allen werten aus dem Array ausgeführt wird ohne das ich die explizit in den quelltext schreiben muss, darum die idee mit der schleife. ok ich google mal serialize =)

Ja, genau so normalisiert man.

Ja und?
Das ist fuer eine Datenbank doch absolut gar nichts.

Datenmodelle sollten vernunftbasiert erstellt werden, und nicht auf Grund von “ich finde aber …” und “ich haette lieber”.

Grundsaetzlich gilt die Regel: Spalteninhalte haben atomar zu sein, also nicht mehr “aufteilbar”.

Spaetestens dann, wenn du weitere Erhebungen auf dem Datenbestand durchfuehren moechtest - bspw. bei wie vielen Nutzern jemand als “Freund” eingetragen ist, wird ein Modell wie dein aktuelles absolut unperformant und aufwendig zu handhaben, weil du dann schon bei der Selektion von Daten den Feldinhalt datenbankseitig aufsplitten musst.

Was auch wieder nur eine andere Art waere, mehrere Inhalte in eine Spalte zu “quetschen”, die dort nicht zusammen hineingehoeren.
Oder anders gesagt, auch die Trennung mehrerer Werte durch einen Doppelpunkt ist bereits eine Serialisierung.

Das aendert an der Sinnhaftigkeit des Datenmodells aber natuerlich nicht das Geringste.

Das kannst du, zumindest in diesem Zusammenhang, bleiben lassen - es bringt dich kein Stueckchen weiter (zumindest nicht in die richtige Richtung).

Ok, danke für die hilfreichen Tipps. Ich dachte ich tu mir einen gefallen wenn ich die Friendlist einträge in ein Feld schreibe, aber wenn das so ist, dann kann ich auf mein altes Model zugreifen das schon funktioniert =) closed