[PHP&MYSQL] Problem mit "Search Tags"

BadKiss

Mitglied
Hallo miteinander,

ich hab (leider) mal wieder ein kleines Problem und benötige eure Hilfe.

Ich habe eine Tabelle, in der Sets stehen --> kleiner Auszug

Tabellenspalte --- Beispiel
sets_serie -- Silent Hill 4: The Room
sets_artist --- Konami
sets_tags --- silent hill;konami


Bei einem anderen Set steht folgendes

Tabellenspalte --- Beispiel
sets_serie --- Silent Hill - Der Film
sets_artist --- Sony Pictures
sets_tags --- silent hill;sony pitures



Ich wollte nun mit folgendem Code die zugehörigen Sets auslesen (bei denen ein Begriff der "Search Tags" die selben sind).

PHP:
$tags = explode(';', $row_card1['sets_tags']);
$newtags = array_unique($tags);
for($i = 0; $i < count($newtags); $i++) {
$sql_tag = "SELECT *
		    FROM sets, sets_cat, sets_ucat
		    WHERE sets_tags != ''
			AND sets_tags LIKE '%".$newtags[$i]."%'
			AND sets_id != ".$row_card1['sets_id']."
			AND sets_cat = sets_ucat_id
			AND sets_cat_id = sets_ucat_ocat_id
		    ORDER BY sets_name";
$result_tag = mysql_query($sql_tag) OR die(mysql_error());
if(mysql_num_rows($result_tag)) {
  echo '<b>&Auml;hnliche Decks</b>:<br /><br />';
  while($row_tag = mysql_fetch_assoc($result_tag)) {
	echo $row_tag['sets_serie'];
  }
}

Zuerst speichere ich die Search Tags des aktuellen Sets (welches ich aktuell aufgerufen hab) in einen Array.
Dann filtere ich diesen Array, dass doppelte Einträge wegfallen.
Mit der Sqlanweisung wollte ich bewirken, dass nun nur die Sets ausgegeben werden, bei denen ein Teil des aktuellen Search Tags identisch ist (in dem Beispiel wäre das silent hill).
Allerdings gibt er mir nun für jeden Searchtag jeweils den Text Ähnliche Decks: 2x aus und dann unterschiedliche Sets (Siehe Bild).

Kann mir da jmd helfen?
Ich würde es gern so machen, dass jedes Set lediglich 1x ausgegeben wird und der Text Ähnliche Decks: ebenfalls nur 1x.
Wenn ich die for-Schleife gleich nach der SQL-Abfrage schließe, so nimmt er lediglich den letzten Search Tag und da dieser nicht übereinstimmt gibt er gar nichts aus...

Ich hoffe, ihr versteht worauf ich hinaus will und jmd kann mir helfen!
 

Anhänge

  • searchtags.png
    searchtags.png
    113,4 KB · Aufrufe: 14
ist schlecht mit dem * als Ausgabe.
Du musst die Felder definieren die du wirklich brauchst. Zduem kannst du dann mit dem Befehl DISTINCT doppelte Daten unterbinden
SQL:
SELECT DISTINCT
    sets.feld1,
    sets.feld2,
    sets_cat.feld1,
.....
 
Zuletzt bearbeitet von einem Moderator:
Das löst mein Problem leider nicht.
Die Searchtags stehen ja als String mit ; getrennt in der Datenbank.
Ich möchte halt prüfen, ob in einem der vorhandenen Search Tags dort zb 'silent hill' steht.
 
SQL:
WHERE sets_tags LIKE '%silent hill%'

Aber eigentlich solltest du das normalisieren. Also die Tags in eine eigene Tabelle packen.

Naja, oderr wenn dan soltest du es so speichern
;Tag1;Tag2;
Also mit ; auch hinten und vorne, damit du mit LIKE '%;tag;% suchen kannst. Ansonsten findest du mit 'silent hill' auch 'silent hill Hallo' etc.
 
Zuletzt bearbeitet von einem Moderator:
Naja, aber jedes Set hat seine eigenen Search Tags.
Da wusste ich jetzt nicht genau, wie ich die auseinenderpflücken sollte.
Vorallem werden es auch immer mehr (im Moment sind es knapp 960 verschiedene).

Und ich möchte ja von allen vorhandenen Sets, bei denen es einen Search Tag gibt, die Tags prüfen, ob eben ein Treffer rauskommt, daher hatte ich ja diese for-Schleife.

EDIT: Hmm, das hatte ich auch schon fast überlegt, das probier ich gleich mal, danke :)

EDIT2: Klappt leider auch nicht, er gibt es noch öfters aus jetzt :(
 
Zuletzt bearbeitet:
Ich würde dir raten deine Datenbank zu normalisieren. Das heißt, dass du noch zwei weiter Tabellen benötigst. Einmal eine, in der du die Tags speicherst mit dazugehörender ID, und die zweite, in der du zwei Spalten hast: Tag-ID und ID der Serie (oder was auch immer). In Letzterer speicherst du die zu einer Serie gehörenden Tag-IDs und beschreibst somit die entsprechenden Beziehungen.
 
Ok, dann werd ichs wohl doch so probieren, danke :)

EDIT: Ok, so klappt es nun :)
Danke.
 
Zuletzt bearbeitet:
Zurück