Zum Inhalt springen

MYSQL Select und Array

Erstellt am 14. Januar 2010 · 7 Antworten · letzte Antwort am 18. Januar 2010

Tags: Frage

Lycanthropy ·

Guten Abend,

ich bin leider im Forum und auch sonst nirgends wirklich fündig geworden was einer Lösung meines Problems helfen könnte.

Ich hole aus einer Tabelle die Werte mehrerer Datensätze raus, jetzt ist allerdings ein Feld dabei, das durchaus ein Array enthalten kann (Werte durch , getrennt).

Die Funktion der Extension ist folgende: Ich lege auf einer Vorlagen Seite Datensätze ab, und gebe ihnen in dem Feld "relation" die Info mit, auf welchen Seiten (Id) sie liegen sollen.
In der rechten Spalte meiner Website ist überall das Plugin zur Ausgabe der Datensätze. Jetzt sollen aber auch nur die Datensätze ausgegeben werden, die für die Seite bestimmt sind, das heisst das Plugin soll jedes mal die Überprüfung durchlaufen, ob eine der im Datensatz hitnerlegten Ids (im Feld relation) mit der Seiten-Id der aktuellen Seite übereinstimmt (relation == $pid).

$query = "SELECT * FROM tx_container_content WHERE deleted = '0' and hidden = '0' order by crdate";
$res = mysql(TYPO3_db, $query);
	while ($data = @mysql_fetch_assoc($res)) {
		$headline = $data[headline];
		$seiten = $data[relation];

$ausgabe .= '<div>'.headline.'</div>';
}

$content .= ''.$ausgabe.'';
	
return $this->pi_wrapInBaseClass($content);

$seiten ist nun ein array mit (unter umständen) mehreren 100 kommagetrennten ids.
Ich habe auch schon diverse Möglichkeiten mit explode probiert, innerhalb der while-Schleife bekomm ich das aber nicht ganz auf die Kette.
Kann mir vielleicht jemand sagen, ob es generell richtig ist hier mit explode zu arbeiten oder kann ich vielleicht doch schon bei der myqsql abfrage etwas anders gestalten?

meckpo ·

Hallo,

für die Performance ist es natürlich gar nicht gut, die Werte in einem Feld zu haben und dann nachträglich splitten zu müssen. Besser wäre also eine Lösung mit einer zweiten Tabelle zu finden in der man die Relations speichert.

Aber zu deiner Frage: prinzipiell ist explode richtig. Mit einem kleinen Trick kannst du das aber auch gleich in der mySQL-Abfrage machen:

$query = "SELECT * FROM tx_container_content WHERE CONCAT(',',relation,',') LIKE '%,".$pid.",%' AND deleted = '0' and hidden = '0' order by crdate";
GoSnA ·

Ich hab das mal mit folgender WHERE Bedingung im SQL gelöst:

$sql = 'SELECT * FROM table WHERE FIND_IN_SET('.$GLOBALS['TSFE']->id.',relation)';

GoSnA ·
steffenk schrieb

wenn schon dann

$sql = 'SELECT * FROM table WHERE FIND_IN_SET(' . $GLOBALS['TSFE']->id . ',relation) > 0';

Naja, sobald das Find in set nen ergebnis bekommen hat welches ungleich 0 ist, ist doch die bedingung erfüllt und somit ist das ">0" nicht notwendig, oder sehe ich das falsch?

GoSnA ·

Die Funktion liefert aber nur NULL wenn beide argumente leer sind, ansonsten liefert sie 0 wenn nichts gefunden oder 1 bis N wenn was gefunden wurde.

Und da Die Page ID eigentlich immer gesetzt ist sollte dies kein problem sein 😉

Aber gut, bringt nichts darüber stunden lang zu diskutieren, klappt beides und wärs sicher haben will nimmt die zweite Variante 😉