Hallo
Bitte poste Beispielinhalt _genau_ dieser Tabelle, wie ich schon schrieb.
Hmm, zu wenig Daten. Ich ergänze ein paar Datensätze, damit die Abfrage sinnvoll wird. Dabei hoffe ich, die Logik Deiner Tabellen richtig verstanden
zu haben
tabelle z_usertags
WER DATUM WAS
1 XXXXXX Spanien
1 XXXXXX Reisen
2 XXXXXX New York
1 XXXXXX Programmieren
3 XXXXXX Fußball
3 XXXXXX Klatschen
Tabelle2:
VON TAG
1 Spanien
1 Reisen
1 Programmieren
38 Klatschen
24 Fußball
17 Reisen
17 Programmieren
17 Fußball
17 Klatschen
19 New York
Ich gehe nun davon aus, dass Du folgendes Resultat haben willst:
Wer Von Anzahl
--------------
1 1 3
2 19 1
3 17 2
Danke für deinen Tipp - habe jetzt die Version 4.1.22 raufgespielt. Hoffe jetzt ist einiges mehr im Bereich des Möglich.
Ja, die kann Subselects.
Wie kommst Du nun ans Ziel?
Ich bin heute nicht fit, meine Lösung sieht mir zu kompliziert aus :-(
Sie hat einen Vorteil: Sie funktioniert.
Nun Schritt für Schritt:
Schritt 1:
Wir schauen uns an, wer was von wem getaggt hat:
SELECT
t1.wer,
t2.von
FROM
z_usertags t1 -- Ich benutze hier Tabellenaliasnamen aus Faulheit
INNER JOIN
tabelle2 t2
ON
t1.was = t2.tag
liefert:
wer von
----------- -----------
1 1
1 1
1 17
2 19
1 1
1 17
3 24
3 17
3 38
3 17
(10 Zeile(n) betroffen)
Schritt 2: Wir zählen, wer wie oft die Begriffe einer Person getaggt hat:
SELECT
t1.wer, -- um wessen Tags geht es
t2.von, -- wer hat diese getaggt
COUNT(t2.von) Anzahl -- wie viele hat er getaggt
FROM
z_usertags t1
INNER JOIN
tabelle2 t2
ON
t1.was = t2.tag
GROUP BY -- gruppiert
t1.wer, -- nach der Person
t2.von
~~~ -- und denjenigen, die dessen Begriffe taggen
liefert als Ergebnis:
wer von Anzahl
\----------- ----------- -----------
1 1 3
1 17 2
3 17 2
2 19 1
3 24 1
3 38 1
Nun bist Du nur an denjenigen je Person (wer) interessiert, die am häufigsten
getaggt haben:
Wäre dies die Ausgangstabelle, so liefert Dir eine korrelierte Unterabfrage
~~~sql
SELECT -- Gib mir
t3.wer, -- die Personen
t3.von, -- und diejenigen, die getaggt haben
t3.Anzahl -- und die Anzahl
FROM tabelle t3
WHERE -- aber nur die,
t3.Anzahl = (
SELECT
MAX(t4.Anzahl) -- die die meisten Tags zu
FROM tabelle t4
WHERE t3.wer = t4.wer -- einer bestimmten Person vorgenommen haben
GROUP BY t4.wer
)
die gewünschten Datensätze:
wer von Anzahl
----------- ----------- -----------
1 1 3
3 17 2
2 19 1
Schritt 4:
Statt Tabelle 3 müssen wir das SELECT-Statement aus Schritt 2 nehmen - und zwar außen wie innen:
SELECT
t4.wer,
t4.von,
t4.Anzahl
FROM (
SELECT
t1.wer,
t2.von,
COUNT(t2.von) Anzahl
FROM
z_usertags t1
INNER JOIN
tabelle2 t2
ON
t1.was = t2.tag
GROUP BY
t1.wer,
t2.von
) t4 -- Beachte, dass Du der Subquery einen Namen geben musst!
WHERE
t4.Anzahl = (
SELECT
MAX(t5.Anzahl)
FROM (
SELECT
t1.wer,
t2.von,
COUNT(t2.von) Anzahl
FROM
z_usertags t1
INNER JOIN
tabelle2 t2
ON
t1.was = t2.tag
GROUP BY
t1.wer,
t2.von
) t5 -- Auch hier ist die Namensgebung zwingend notwendig.
WHERE t4.wer = t5.wer
GROUP BY t5.wer
)
liefert ebenfalls das gewünschte Resultat:
wer von Anzahl
----------- ----------- -----------
1 1 3
2 19 1
3 17 2
(3 Zeile(n) betroffen)
Anmerkungen:
1. Du kannst natürlich nach jeder beliebigen Spalte sortieren.
2. Ich hoffe nur, dass ich Deine Problemstellung richtig verstanden habe.
Freundliche Grüße
Vinzenz