[MySql] Group by einer Tabelle über mehrere Spalten

jayplaya1

Mitglied
hey leute ich bekomm gleich eine kleine kriese wegen folgendem:
sagen wir ich habe eine tabelle mit from und to(alles andere ist erstmal unwichtig)
die folgenden inhalt hat

from to
1 2
1 2
2 1
2 1
3 1

mit SELECT from, to FROM tabelle GROUP BY from, to
gibt sql mir 3 Werte zurück, ich möchte aber nur 2 werte angezeigt bekommen. sql soll also alle gruppieren die in from oder to eine 1 haben und in from oder to den gleichen wert haben(außer natürlich 1), also als ergebnis 1 2 bzw 2 1 und 3 1.
was soll ich machen? i need your help!
 
Ich verstehe nich ganz wie du gruppieren willst aber lösen kannst du es mit einer IF-Anweisung in der Abfrage

SQL:
SELECT wert1, wert2, IF(wert1 = 1 OR wert2 = 1, 1,0) AS g  FROM tabelle GROUP BY g


die in from oder to eine 1

Dadurch gibt es mit den obigen Daten nur einen Wert zurück.
 
Zuletzt bearbeitet:
item: from ist ein gaaaaaanz schlechter Feldname, nur so nebenbei. Weil FROM ist ein SQL-Schlüsselwort. wenn du also dein Feld nicht immer brav in ´ setzt, scheitert dein SQL

item: Annahme: DB ist MySQL

SQL:
SELECT DISTINCT
	nr1,
	nr2
FROM
	(
		SELECT
			-- nimm den kleineren Wert als ersten ...
			if(`to` > `from`, `to`) AS nr1,
			-- ... und den Grösseren als zweiten Wert
			if(`to` < `from`, `to`) AS nr2
		FROM
			myTable
	) AS myData
 
Zuletzt bearbeitet von einem Moderator:
hey, erstmal danke. die spalten heißen natürlich nicht from oder to. es bezieht sich auf ein pms system.
spalten heißen eigentlich from_user, to_user und in dem beispiel oben bin ich id =1.
ich möchte halt in einer art posteingang nicht alle nachrichten einzeln gelistet haben, sondern gruppiert.
anderes beispiel: ich bin id=1 denny ist id=2 peter ist id=3 und susi ist id=4. die tabelle sieht jetzt folgendermaßen aus:
id from_user to_user
1 1 3
2 1 3
3 3 1
4 2 1
5 1 2
6 1 4
7 1 4
8 4 1

es sind also ingesamt 8 nachrichten, nach meinem vorhaben sollen aber nur 3 leute dastehen(also mit denen ich schreibe), weil ja 3 konversationen. nach meinem beispiel oben macht er 6 daraus, weil er, wenn to_user und from_user vertauscht stehen, diese als eigenständigen datensatz anzeigt. ich will aber praktisch nr 1-3, 4-5 und 6-8 in diesem beispiel gruppieren.
natürlich gibt es noch jede menge anderer nachrichten und die nachrichten werden nicht in solch einer reinfolge gelistet sein.
wie muss also die sql abfrage aussehen**** wär echt super wenn ihr mir da helfen könntet
 
So müsste deine Abfrage aussehen
SQL:
SELECT DISTINCT
	nr1,
	nr2
FROM
	(
		SELECT
			-- nimm den kleineren Wert als ersten ...
			if(`to` > `from`, `to`) AS nr1,
			-- ... und den Grösseren als zweiten Wert
			if(`to` < `from`, `to`) AS nr2
		FROM
			myTable
	) AS myData
 
Zuletzt bearbeitet von einem Moderator:
hey yaslaw, die abfrage funktioniert irgendwie nicht

SQL:
$sql = "SELECT DISTINCT
  		 	from_user,
   			to_user
		 FROM
    (
        SELECT
            IF(to_user > from_user, to_user) AS from_user,
            IF(to_user < from_user, to_user) AS to_user
        FROM
           tabelle
    ) AS myData
	 ";

folgender fehler: near ') AS from_user, IF(to_user < from_user, to_user) AS to_user ' at line 7
ich habe leider zuvor noch nie mit if anweisungen gearbeitet und kann ihn daher nicht interpretieren!

mfg aus berlin
 
Zuletzt bearbeitet von einem Moderator:
Es dürfte weniger an dem if als vielmehr an der fehlenden Tabellengabe liegen, sieht jedenfalls für mich so aus. Für meine Begriffe haut aber die gesamte Abfrage nicht hin.

SQL:
SELECT DISTINCT 
IF( to_user > from_user, to_user, from_user ) AS 'user1', 
IF( to_user < from_user, to_user, from_user ) AS 'user2'
FROM TABELLE
WHERE to_user =1
OR from_user =1

Das sollte dir alle User ausgeben, mit denen du geschrieben hast, plus dich. Das Problem ist nur, dass du hiernach nicht unterscheiden könntest, wer davon du bist und wer der andere, weil der andere je nach id entweder in user1 oder user2 steht. Ich hab es so verstanden dass du einfach nur alle deine Gesprächspartner auflisten möchtest.

SQL:
SELECT DISTINCT 
IF( to_user !=1, to_user, from_user ) AS 'partner'
FROM TABELLE
WHERE to_user =1
OR from_user =1

Sorry wenn ich da was missverstanden hab :rolleyes:
 
Zuletzt bearbeitet von einem Moderator:
Hey, habs hinbekommen, das problem lag wirklich daran das ich angeben musste wer ich bin. Zudem kannte ich mich nicht mit if anweisungen aus, im beispiel von yaslaw war keine false anweisung in der if bedingung, deswegen kam immer der fehler. Naja, läuft jetzt:) dank euch auf jeden fall für die richtige weg weisung!! Beste grüße
 

Neue Beiträge

Zurück