Statusnachrichten - Zwei SQL-Abfragen zu einer vereinen

lisali

Erfahrenes Mitglied
Hi,

ich habe folgenden Code:

PHP:
	$flist = array();
	$result = mysql_query("SELECT `left`,`right` FROM `friends` 
	WHERE `left` = '".$_SESSION['id']."' OR `right` = '".$_SESSION['id']."' ");
	while ($friend = mysql_fetch_assoc($result))
	{ 
	if ($friend['left'] == $_SESSION['id']) array_push($flist, $friend['right']);
	else array_push($flist, $friend['left']);
	}
	$i = 1;
	foreach($flist as $key){ 
	if ($i > 1) $opr = "OR ";
	$extend_query .= "".$opr." ul.`uid` = '".$key."' "; 
	$i++; }
	
	$result = mysql_query("SELECT ul.`uid`,ul.`query`,ul.`date`
	FROM `users_log` AS ul
	WHERE ".$extend_query." 
	ORDER BY ul.`date` DESC");
	echo mysql_error();

Es ist schon fast peinlich, dass ich mein "Problem" so gelöst habe, deswegen bitte ich hier um Ratschläge.

Also, es geht darum, dass ich anzeigen möchte welcher meiner Freunde gerade was getan hat. Das wird alles in "users_log" gespeichert.
Ich habe es irgendwie nicht hinbekommen mit einem JOIN zu lösen, aber ich würde gerne aus diesen 2 SQL-Abfragen eine machen.

Was ich getan habe ist, dass ich einfach alle Freunde extra aus der Tabelle geholt habe und die ID's in einem Array gespeichert habe. Und diese wiederum in einer Variable und somit "bilde" ich die eigentliche Query (das letzte $result).

Und naja... das klappt natürlich auch, nur ist es sehr unschön und mich stört das irgendwie.

Ich wäre für Hilfe sehr sehr dankbar!
 
Hi lisali,

deine App fordert dich scheinbar ordentlich heraus. Das ist gut so :-)

folgender Query sollte dir helfen:
SQL:
SELECT		ul.`uid`,
			ul.`query`,
			ul.`date`
FROM		`users_log` AS ul
JOIN		(
			  SELECT	f1.`left` as uid
			  FROM		`friends` AS f1
			  WHERE		f1.`right` = '". (int) $_SESSION['id'] ."'
			  UNION DISTINCT
			  SELECT	f2.`right` as uid
			  FROM		`friends` AS f2
			  WHERE		f2.`left` = '". (int) $_SESSION['id'] ."'
			) AS fx
			ON fx.`uid` = ul.`uid`
ORDER BY	ul.`date` DESC

Grüße BN
 
Zuletzt bearbeitet von einem Moderator:
Hey BN!

Dankeschön. Ich habe deine Abfrage mal übernommen und mit meinem Script verbunden:

PHP:
$result = mysql_query("	
SELECT      ul.`uid`, ul.`query`, ul.`date`
FROM        `users_log` AS ul
JOIN        (
              SELECT    f1.`left` AS uid
              FROM      `friends` AS f1
              WHERE     f1.`right` = '". (int) $_SESSION['id'] ."'
              UNION DISTINCT
              SELECT    f2.`right` AS uid
              FROM      `friends` AS f2
              WHERE     f2.`left` = '". (int) $_SESSION['id'] ."'
            ) AS fx
            ON fx.`uid` = ul.`uid`
ORDER BY    ul.`date` DESC
");

	#><<<<<<<<<<<<<<<<<<<<<<<<<<<< BIS HIER
	
	echo "<ul style='padding-bottom:18px'>";
	while ($log = mysql_fetch_array($result))
	{
	parse_str($log['query'], $q);
	
	#echo "<pre>".print_r($friends)."</pre><br>";
	
	$me = "<span class='f14'>".username($log['uid'])."</span> ";
	if ($q['do'] == 'about') 
	{ # --- Selbstbeschreibung wurde aktualisiert:
	$icon = "<img src='images/icon/note.png' alt='' width='14' height='12' />";
	$str = "hat die Selbstbeschreibung bearbeitet.";
	}
	elseif ($q['do'] == 'fship')
	{ # --- Freundschaft geschlossen:
	$icon = "<img src='images/icon/friends.png' alt='' width='16' height='11' />";
	$str = "ist jetzt mit ".username($q['id'])." befreundet.";
	}
	elseif ($q['do'] == 'comment')
	{ # --- Pinnwand-Eintrag:
	$icon = "<img src='images/icon/clip.png' alt='' width='11' height='12' />";
	$str = "schrieb ".username($q['id'])." auf die Pinnwand.";
	}
	elseif ($q['do'] == 'pimg')
	{ # --- Pinnwand-Eintrag:
	$icon = "<img src='images/icon/pictures.png' alt='' width='14' height='13' />";
	$str = "hat ein neues Profilbild hochgeladen.";
	}
	elseif ($q['do'] == 'login')
	{ # --- Neu angemeldet:
	$icon = "<img src='images/icon/hits.png' alt='' width='7' height='11' />";
	if (isset($q['id'])) $str = "wurde von ".username($q['id'])." geworben und ";
	$str .= "hat sich gerade neu angemeldet.";
	}
	
	echo "<li>".$icon."&nbsp; ".$me."".$str." <span class='colorGrey f11'>(vor ".timediff($log['date']).")</span></li>";
	}
	echo "</ul>";
}

Leider werden aber gewisse Einträge nicht angezeigt. Zum Beispiel bestimmte Freundschaften, die ich geschlossen habe. Außerdem wollte ich noch einbinden, dass ich sehe, ob mir auf die Pinnwand geschrieben wurde. Wie müsste ich da die Abfrage erweitern?

PS: Die Kommentare nicht beachten.
 
Deine eigenen Aktionen werden im Query nicht berücksichtigt. Es werden nur Aktionen deiner "Freunde" berücksichtigt. Ich nehme mal an, die fehlenden Aktionen sind Aktionen von dir $_SESSION ['id']?

Wie sieht so ein Pinnwandeintrag in der DB aus?
 
Ah, verstehe. Aber wenn ich da einfach meine ID in die Abfrage einbringe, würde er mir wohl auch wiederum "zu viel" unnötiges anzeigen, schätze ich mal?

Also, die Einträge sind in "comments" gespeichert. Da hätte ich auch gleich direkt eine Frage, denn ich wollte es mir leicht machen, habe jetzt aber meine Bedenken. Also, ich habe eine Funktion, die überall auf der Seite ein Kommentar schreiben erlaubt und deswegen wird auch alles mit jeweiligen ID Angaben über den Bereich in "comments" gespeichert.

Ist es z.B., wenn noch ein Forum dazu kommt, etc. sinnvoller für jeweils jeden Bereich eine Extra-Tabelle zu machen oder ist das mit "comments" auch ganz okay?

comments hat folgende Spalten bei mir:

id area cid uid text date

cid steht für die aktuelle Seiten-ID.
 
a) So ist es, aus dem Query würden dann all deine Aktionen "ausgespuckt" werden.
b) Kannst du so machen mit der zentralen comments Tabelle, achte aber auf gescheite Indexe

Wie soll die Aktion "jemand hat auf deine Pinnwand geschrieben" nun in die Abfrage einfließen? Mir ist noch nicht ganz klar, worauf du hinaus möchtest. Soll einfach der Status ausgegeben werden oder der Eintrag?
 
b.) gut, das freut mich zumindest mal.

Erstmal nur, dass User X mir auf die Pinnwand schrieb. Und wenn ich mit jemanden Freundschaften erfolgreich geschlossen habe, wollte ich das auch anzeigen lassen... aber rein logisch gedacht bin ich noch nicht dahintergekommen wie ich das anstellen könnte...
 
Dann müßtest du die Abfrage um deine ID erweitern, und nicht benötigte Logeinträge einfach in PHP übergehen.

SELECT deine_id
UNION
der andere UNION

Grüße BN
 
du erweiterst einfach den existenten UNION innerhalb der Klammerung :-) Wichtig ist noch dass du SELECT deine_id AS uid schreibst, sonst bekommst du vom SQL-Server Schimpfe :)
 
Zurück