Tag-Basierte Suche

suntrop

Erfahrenes Mitglied
Hi.

Ich möchte ein Skript schreiben, mit dem ich den Überblick über alle meine Websites behalte kann. Statt einer Kategorisierung möchte ich lieber handelsübliche Tags wie bei delicious.com benutzen (eine Tag-Cloud brauche ich nicht).

Ich habe drei Tabellen, domains, tags und tags_domains. (Idee von hier) Und hier komme ich schon nicht weiter.
Wie ordne ich Tags den Domains zu? Was wann eine Domain mehrere Tags haben soll? Wie kann ich jetzt weiter machen?
Freue mich über jeden Ratschlag und jede Hilfe!

Grüße
suntrop

P.S.
Fremde Skripte habe ich auch schon gesucht, aber nichts passendes gefunden. Bei Blogs wie Word-Press und Serendipity finde ich im Quellcode nicht die entsprechenden Stellen.
 
Hi, also im Prinzip steht ja schon fast alles dazu im von dir verlinkten Thread im letzten Post drin. Du erstellst also wie dort vorgeschlagen deine 3 Tabellen, trägst zunächst in die 1. deine Websites ein und danach in die 2. die Tags, die du verwenden willst. Die beiden Tabellen müssen jeweils ein PRIMARY KEY oder zumindestens ein UNIQUE INDEX Feld enthalten, damit du jede Zeile in der Tabelle eindeutig identifizieren kannst. Meistens verwendet man dazu einfach eine Spalte namens id, vom Typ INT UNSIGNED NOT NULL auto_increment, die man dann als Primärschlüssel verwendet.

Die Zuordnung der Tags zu den Websites erfolgt dann durch die 3. Tabelle, diese braucht im Prinzip nur 2 Spalten, eine für die id der Website und eine für die id des Tags. Dann musst du eben die id der Website kennen, und die ids der tags, die du zuordnen willst, und machst für jedes Tag einen Eintrag in die Tabelle. Hier mal ein kleines Beispiel:
Code:
Pages:
+----+------------+
| id | name       |
+----+------------+
|  1 | Homepage 1 |
|  2 | Homepage 2 |
+----+------------+

Tags:
+----+-------+
| id | tag   |
+----+-------+ 
|  7 | Hallo |
|  8 | Welt  |
|  9 | Test  |
+----+-------+

Zuordnung:
+---------+--------+
| page_id | tag_id |
+---------+--------+
|       1 |      7 |
|       1 |      8 |
|       2 |      7 |
|       2 |      9 |
+---------+--------+
Das wären z.B. Tabelleninhalte, die "Homepage 1" die Tags "Hallo" und "Welt", sowie "Homepage 2" die Tags "Hallo" und "Test" zuordnet.

Ich hoffe das verdeutlicht das Prinzip nochmal ein wenig. ;)
 
Zuletzt bearbeitet:
Ich hoffe das verdeutlicht das Prinzip nochmal ein wenig.
Das tut es! Vielen Dank für deine Antwort. Ich glaube damit komme ich schon ein ganzes Stück weiter. Ich werde es morgen testen.

Eine Sache verstehe ich jedoch noch nicht ganz. Wie lese ich die Tabelle "Zuordnung" aus?
Ich habe bisher immer nur nach einer Übereinstimmung in einer Tabelle gesucht und das Ergebnis ausgegeben.
Aber jetzt muss ich ja … darüber nachzudenken macht mir knoten in den Kopf. Sorry, komme einfach nicht drauf. Vielleicht nochmal ein kurzer Tipp dazu?
 
Wasman dafür braucht sind sogenannte JOINS, diese bieten die Möglichkeit Tabellen zu verknüpfen. Was genau du in SQL abfragen musst ist natürlich davon abhängig, was du machen willst.

Wenn du zum Beispiel alle Websites suchst, die das Tag "Hallo" haben, dann geht es mit folgender SQL-Abfrage
SQL:
SELECT
  pages.*
FROM
  pages,
  zuordnung,
  tags
WHERE
  pages.id = zuordnung.page_id
AND
  zuordnung.tag_id = tags.id
AND
  tags.tag = 'Hallo'
 
Zuletzt bearbeitet von einem Moderator:
Hallo EvilO.

Großen Dank für deine Hilfe! Das mit den JOINS habe ich mal gelesen, hatte aber bislang nicht das Vergnügen sie zu nutzen :-)
Jetzt kann ich es testen.


Grüße
suntrop
 
Jetzt hängt mein Programm an anderer Stelle.

Ich möchte nebst Domain, alle Tags die der Domain zugeordnet sind ausgeben. Das wird die Übersichtsseite mit allen Domains.

Dazu habe ich verschiedene SQL-Abfragen getestet und bin jetzt hier angelangt:
PHP:
$sql = 'SELECT
			domains.*
		FROM
			domains,
			tags_domains,
			tags
		WHERE
			domains.id = tags_domains.domain_id
		AND
			tags_domains.tag_id = tags.id
		GROUP BY
			domain
		ORDER BY
			id';
So bekomme ich alle Domains, aber ich erhalte nicht die Tags, die den Domains zugeordnet sind.
Ich kann mir nicht mal ins deutsche Übersetzt die SQL-Abfrage zusammenbasteln.

Bislang habe ich es so gemacht, dass ich in einer ersten Abfrage alle Domains auswähle, diese in einer while-Schleife ausgebe und in dieser Schleife bei jedem Durchgang eine weitere SQL-Abfrage nach den Tags mache.

Aber das muss doch auch effizienter gehen, oder nicht?
 
Ich glaube ich bin einen Schritt weiter gekommen, aber noch funktioniert es nicht ganz.
Ich habe jetzt mit einen UNION SELECT noch die Tags ausgewählt, aber jetzt erhalte ich (glaube ich) zu viele Datensätze bzw. sind die recht durcheinander.

PHP:
$sql = '
	SELECT
		td.id id_td,
		td.domain_id domain_id,
		td.tag_id tag_id,
		d.id id_d,
		d.domain domain
	FROM
		tags_domains td,
		domains d
	UNION
		SELECT
			td.id id_td2,
			td.domain_id domain_id2,
			td.tag_id tag_id2,
			t.id id_t,
			t.tag tag
		FROM
			tags_domains td,
			tags t
		WHERE
			t.id = td.tag_id
		GROUP BY
			td.domain_id';
 
Zurück