MySQL: Objekt matching anhand von Tags?

ap1

Grünschnabel
Hi Leute

Ich habe einige Tabellen, einmal etwa die Tabelle user, welche definiert wie User heißen etc., user_tags, welche definiert welche Eigenschaften auf welchen User wie stark zutreffen, events, welche definiert wie welches Event heißt usw., dann event_tags, welche die Eigenschaften eines Events definiert (allerdings nicht die Ausprägung dieser) und zu guter letzt die Tabelle tags, welche Definiert welcher Tag wie heißt (Bildchen + Beschreibung). Hier aber nur die Relevanten Spalten der Tabellen:

= user =
user_id | username
1 _____| testuser
2 _____| usertest

= user_tags =
user_id | tag_id | tag_weight
1 _____| 1___ | 21______
1 _____| 2___ | 50______
1 _____| 3___ | 13 _____
2 _____| 4___ | 30______
2 _____| 5___ | 54______
hier mag der User testuser(1) den Tag 2 offensichtlich mehr als den Tag 1 und Tag 2

= events =
event_id | event_titel | ...
1 _____ | Big Party 1 |...
2 _____ | Testevent 2|...
3 _____ | Testevent 3|...

= event_tags =
event_id | tag_id
1 _____ | 1
1 _____ | 2
2 _____ | 2
3 _____ | 1
3 _____ | 4
3 _____ | 5

= tags =
tag_id | tag_name
1 ____| rock
2 ____| pop
3 ____| dance
4 ____| bar
5 ____| disco

Was möchte ich?
Ich möchte, dass aus den einzelnen Tabellen folgende "Vorschläge" entstehen:

- User 1, würde Event 1 sehr gut gefallen, da das Event seinen am meisten ausgeprägten Tags entspricht: 2 und 1... Multipliziert wäre es das Beste Event für ihn, da sich ergeben würde:
<tag_ausprägung:tag2>+<tag_ausprägung:tag1>=71

- User 2, würde das Event 3 zusagen. Zwar hat dieses einen Tag, der ihm völlig egal ist, aber dafür zwei andere und dazu seine wichtigsten:
<tag_ausprägung:tag5>+<tag_ausprägung:tag4>+<tag_ausprägung:tag3*>=84 __ * wäre = 0

Hoffe ihr versteht was ich mein und könnt mir helfen, mit welcher SQL Query ich das bewerkstelligen könnte?
Vielen Dank!
 
Als erstes verbindest du die user_tags mit den event_tags um die Gemeinsamkeiten zu finden
SQL:
SELECT
	ut.user_id,
	ut.tag_id,
	ut.tag_weight,
	et.event_id
FROM
	user_tags ut,
	event_tags et
WHERE
	ut.tag_id = et.tag_id

Dann kannst du über die user_id und event_id gruppieren und die Gewichtung summieren. Und schon hast du das was du suchst.

SQL:
SELECT
	user_id,
	event_id,
	SUM(tag_weight) AS weight
FROM
	(
		SELECT
			ut.user_id,
			ut.tag_id,
			ut.tag_weight,
			et.event_id
		FROM
			user_tags ut,
			event_tags et
		WHERE
			ut.tag_id = et.tag_id
	) d
GROUP BY
	user_id,
	event_id

Wenn ud alles ausdeutschen willst (also Namen anstelle von ids), dann kannst du da noch die Namen anhängen. Zusätzlich habe ich mit GROUP_CONCAT noch eine Text-Liste reingetan, die auflisten welche Tags dass übereinstimmen.
SQL:
SELECT
	u.username,
	e.event_titel,
	d.tags,
	weight,
	u.user_id,
	e.event_id
FROM
	(
		SELECT
			user_id,
			event_id,
			SUM(tag_weight) AS weight,
			GROUP_CONCAT(tag_name) AS tags
		FROM
			(
				SELECT
					ut.user_id,
					ut.tag_id,
					ut.tag_weight,
					et.event_id,
					t.tag_name
				FROM
					user_tags ut,
					event_tags et,
					tags t
				WHERE
					ut.tag_id = et.tag_id
					AND ut.tag_id = t.tag_id
			) d
		GROUP BY
			user_id,
			event_id
	) d
	INNER JOIN user u ON u.user_id = d.user_id
	INNER JOIN events e ON e.event_id = d.event_id

ergibt
Code:
username | event_titel | tags      |weight |user_id |event_id
-------------------------------------------------------------
testuser | Big Party   | pop,rock  |71     |1       |1
testuser | Testevent   | pop       |50     |1       |2
testuser | Testevent   | rock      |21     |1       |3
usertest | Testevent   | disco,bar |84     |2       |3
 
Zuletzt bearbeitet von einem Moderator:
Zurück