[SQL] Problem mit GROUP BY-Zuordnung

raven

Well-known member
20 April 2006
5.038
540
Hallo,
ich habe ein Problem mit MySQL; ich bekomme eine GROUP BY-Zuordnung einfach nicht richtig hin.

In meinem Beispiel werden zwei Tabellen verwendet:
ct_user_history: Eine Liste mit vielen IP-Adressen und zugehörigen User-IDs
ct_user: Die Usertabelle; für das Beispiel eigentlich nicht relevant, aber da ich joine, wollte ich die im Query behalten.

Der vereinfachte Query sieht nun so aus:
PHP:
SELECT h.ipaddress, u.userID FROM ct_user_history h INNER JOIN ct_user u ON u.userID=h.userID GROUP BY h.userID, h.ipaddress HAVING COUNT(*) > 1

Ich möchte nun alle Records anzeigen, die eine IP-Adresse haben, die mehr als einmal vorkommt, jedoch nur diese; und dann jeweils noch als einzelne Records mit userID. Sollte es mehrere mehrfach genutzte IP-Adressen geben, sollen diese ebenfalls angezeigt werden.

Ich merke schon, ich bin in MySQL alles andere als fit ... hat jemand eine Idee, wie mein Problem zu lösen ist?

Danke!
raven
 
PHP:
group by h.ipaddress, u.userID

man muss alle felder grupieren die man selected wenn ich recht weis


edit
PHP:
SELECT h.ipaddress, u.userID COUNT(*) as count FROM ct_user_history h INNER JOIN ct_user u ON u.userID=h.userID GROUP BY h.userID, h.ipaddress HAVING  count > 1
 
Zuletzt bearbeitet:
Nein, das löst mein Problem nicht. Ich möchte im Prinzip folgende Ausgabe haben: (imitiert mit Testtabelle)

test1_e0d.png


Bekomme mit meinem Query aber sowas:

test2_acf.png
 
Darf ich mal nachfragen, was du genau haben willst? Das ist mir nämlich nicht so ganz klar...

Interessieren dich hauptsächlich die userID's oder eher die IP-Adressen?

Wenn du aus der user-Tabelle nur die IDs nimmst, warum joinst du dann überhaupt? Die stehen doch auch in der user_history drin! Oder brauchst du da noch mehr Daten raus? (Also ist der Join wirklich nötig?)

Ohne Join würde das ganze folgendermaßen lauten:

PHP:
SELECT ipaddress, userID FROM ct_user_history  GROUP BY userID, ipaddress HAVING COUNT(id) > 1

id ist dabei der Primary Key in der Tabelle ct_user_history! Da sowohl ipaddress als auch userID gruppiert werden, brauch ich noch eine extra Spalte, deren Anzahl ich zählen kann. Hier bietet sich der Primary Key an. Ich hoffe du hast einen...

Hoffe das hilft weiter.
 
Mit ein GROUP BY kommst du nicht weit, dazu brauchst du 1 Subselect. Erstmal leist du alle IPs aus die verschiedene UserIds haben. Das würd ich so machen:

PHP:
SELECT 
	ct_user_history.ipaddress,
	COUNT(DISTINCT ct_user_history.userID) as users
FROM
	ct_user_history
GROUP BY
	ct_user_history.ipaddress
HAVING users > 1

und mit den Daten kannst du jetzt die doppelten Ips rausfischen. Zb mit dem oben erwähnten Subselect.

PHP:
SELECT 
	*
FROM 
	(
		SELECT 
			ct_user_history.ipaddress,
			COUNT(DISTINCT ct_user_history.userID) as users
		FROM
			ct_user_history
		GROUP BY
			ct_user_history.ipaddress
		HAVING users > 1
	) AS ct_user_history_filter INNER JOIN
	ct_user_history ON (ct_user_history_filter.ipaddress = ct_user_history.ipaddress) INNER JOIN
	ct_user ON (ct_user.userID = ct_user_history.userID)

Das ganze ist aber nicht wirklich Ressorucen schonend.