• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

noch ein weiterer inner join?

djfabi

Mitglied
Hallo,

ich hoffe ich bekomme zu dieser Festzeit noch eine Antwort O:

Also wie mache ich aus diesem Code:
PHP:
$s = mysql_query("SELECT
  friends.userid,
  friends.v,
  friends.n
FROM
  user as friends
INNER JOIN
  friendships
ON
  (
    (
      friendships.user1 = '".mysql_real_escape_string($id)."' AND
      friends.userid = friendships.user2
    ) OR
    (
      friendships.user2 = '".mysql_real_escape_string($id)."' AND
      friends.userid = friendships.user1
    )
  )  ");

einen zweiten inner join?

Also ich will jetzt von meinen Freunden die aktuellen Post Nachrichten selektieren.
Also wie bei facebook Nachrichten aus dem Newsfeed, sozusagen.

Wie mache ich das, gibt es da noch einen inner join?
Kann mir jemand erklären?

Gruß und Frohe Festtage & einen Guten Rutsch euch allen :)
 
Werbung:
Du kannst so viele INNER JOINs bzw. JOINs machen wie Du willst. Musst nur darauf achten, dass das Statement dann noch performant läuft.
 
ok, und wie sähe das dann spontan aus?

Weil ich habe die Theorie aber die Praxis hier fehlt mir.

Könntest du mir im Ansatz helfen?
 
Werbung:
ohhh maaan, ich werde einfach nicht durch diese Manuals schlau.. -.-

Kann mir hier irgentwer bitte auf die Sprünge helfen, ich drehe durch ! ..

Ich habe jetzt schon beim SELECT das hier hinzugefügt:
PHP:
post.id,
  post.content,
  post.code,
  post.time

Aber was mache ich jz wie damit?

Ich steige da nicht durch, aarrrrrr

Könnte mir bitte ein besonders netter Mensch auf die Sprünge helfen?
 
Durchdrehen hilft da wenig ;) Ruhe ist angesagt :)

Einfache Beispiele:

Hier werden 3 Tabellen zusammen gejoint, jeweils über zusammengehörende IDs:
Code:
SELECT *
FROM tablle1
INNER JOIN tablle2 ON tabelle1.spalte1 = tabelle2.spalte1
INNER JOIN tablle3 ON tabelle1.spalte1 = tabelle3.spalte1

Hier werden 2 Tabellen gejoint, eine davon jedoch doppelt, nur mit jeweils einer anderen Bedingung:
Code:
SELECT *
FROM tablle1 t1a
INNER JOIN tablle2 t2 ON t1a.spalte1 = t2.spalte1
INNER JOIN tablle1 t1b ON t1a.spalte2 = t1b.spalte2

Hier wird eine Tabelle 2 mal mit sich selbst gejoint:
Code:
SELECT *
FROM tablle1 t1a
INNER JOIN tablle2 t1b ON t1a.spalte2 = t1b.spalte2
INNER JOIN tablle1 t1c ON t1a.spalte3 = t1c.spalte3

Zu beachten ist hierbei lediglich, dass man die logischen Bezüge wie bei jeder Einbindung von Tabellen in einem SQL-Statement beachten muss. In deinem Fall geht es ja um die Abbildung von Freundschaften, welche über IDs zugeordnet werden. Genau das was Du hierbei abbilden willst, musst Du in diesem Statement auch inhaltlich erfassen.

Tipp: mir hilft es manchmal bei komplexeren Sachen diese erst mal in Prosa, ausformuliert, nieder zuschreiben. Danach kann man auf dieser Basis das Statement entwerfen.
Und: du solltest nicht mit den auszulesenden Spalten anfangen, wie der letzter Beitrag erahnen lässt. Du solltest wie gesagt bei den Beziehungen untereinander anfangen.
 
Werbung:
ok, werde mich da mal durchhauen :D
Danke :)

Nur zwei Fragen bleiben mir noch:
-heisst es nicht: FROM tablle1 as t1a anstatt: tablle1 t1a?
-wo ist der unterschied zwischen INNER JOIN, LEFT JOIN, RIGHT JOIN usw..?

Danke aber :)
 
-heisst es nicht: FROM tablle1 as t1a anstatt: tablle1 t1a?

Das Wort "as" kann man in MySQL durchaus auch weglassen. Bei sehr langen Statements nutze ich es aber (und dann komplett groß geschrieben, also "AS"), allein der Übersicht wegen.

-wo ist der unterschied zwischen INNER JOIN, LEFT JOIN, RIGHT JOIN usw..?

Dazu kenne ich hier ein praktisches Beispiels zu Veranschaulichung:
SQL: Unterschied zwischen LEFT JOIN, RIGHT JOIN und INNER JOIN unter Access
 
verdammt, ich starre jetzt schon gefühlt 10 Stunden auf meinen Laptop.
Wieso geht das nicht?

So sehen meine Tabellen aus
user:
Code:
userid - vorname - nachname - username
1 - Max - Mustermann - maxi
2 - Max - Gabriel - maxi_geb
3 - Gustav - Sollig - max_skad_skjand
4 - lol - lol - lol_lol

friendships:
Code:
friendship_id - user1 - user2
1 - 1 - 3
2 - 4 - 1
3 - 1 - 2

posts:
Code:
pid - puserid - content - code - time
1 - 2 - hallo - 123382 - [COLOR=#000000][FONT=sans-serif]1356135884
[/FONT][/COLOR]2 - 3 - hi - 1092i30 - [COLOR=#000000][FONT=sans-serif]1356135884
[/FONT][/COLOR]3 - 4 - heeey - 123421r - [COLOR=#000000][FONT=sans-serif]1356135884[/FONT][/COLOR]

usw..

Naja und ich habe es mit diesem Code versucht:
PHP:
			$s = mysql_query("SELECT *
FROM user as u
INNER JOIN friendships as f ON u.userid = f.user2
INNER JOIN posts as p ON u.userid = p.pid
ORDER BY pid DESC 
 ") or die(mysql_error());






while($b = mysql_fetch_object($s)){
	$v = htmlspecialchars($b->pid);
	$n = htmlspecialchars($b->content);
	echo $v." ".$n;
}

abgesehen davon, das ich nur meine Freunde aus user2 bekomme (weil ich es nicht hinbekommen habe) geht das nicht, weil jeweils nur die gleiche ID in der posts Tabelle gesucht wird, und nicht die von den Freunden..

Könnte mir bitte jemand helfen, ich will das noch vor Weihnachten fertig haben... O:
Das ist sehr kompliziert..
Danke an threadi
 
Werbung:
Klar, also ich möchte die aktuellen Posts von meinen Freunden aus der Tabelle posts selektieren.

Also ich will meine Freunde wissen, und von denen die posts (wie bei facebook) heraussuchen.

Wie soll ich das erklären? :D

hast du verstanden, was mein Ziel ist?
 
Ich zeig mal wie ich dabei gedanklich vorgehe:

1. Es geht um Posts:
Code:
SELECT * FROM posts

2. Beschränke es auf Posts von Nutzern die in friendships enthalten sind:
Code:
SELECT *
FROM posts
INNER JOIN friendships ON posts.puserid = friendships.user2

3. Beschränke es auf Posts die mit dem aktuellen Nutzer in Freundschaft verbunden sind:
PHP:
$sql = "SELECT *
FROM posts
INNER JOIN friendships ON posts.puserid = friendships.user2 AND friendships.user1 = ".$userid;
$return = mysql_query($sql) or die($mysql_error);

Theoretisch sollte man eigentlich auch noch sicherstellen, dass die Nutzer auch in der Tabelle user existieren - muss man aber nicht. Dazu müsste man die Tabelle user folgendermaßen einbinden:
PHP:
$sql = "SELECT *
FROM posts
INNER JOIN friendships ON posts.puserid = friendships.user2 AND friendships.user1 = ".$userid."
INNER JOIN users u1 ON u1.userid = friendships.user1
INNER JOIN users u2 ON u2.userid = friendships.user2;
$return = mysql_query($sql) or die($mysql_error);

Um deine Verwirrung zu vollenden sag ich jetzt mal noch, dass man das auch ohne INNER JOIN schreiben könnte. In MySQL ist INNER JOIN quasi ein Alias für WHERE. Daher könnte das Statement auch so aussehen:
PHP:
$sql = "SELECT *
 FROM posts, friendships, users u1, users u2
WHERE posts.puserid = friendships.user2 
 AND friendships.user1 = ".$userid."
 AND u1.userid = friendships.user1
 AND u2.userid = friendships.user2;
$return = mysql_query($sql) or die($mysql_error);
 
Werbung:
Danke threadi, danke, danke, danke!!!

Es funktioniert!
Danke vielmals :D

Noch ne Frage:
Wie bekomme ich dann auch noch die Sachen, von mir?
Weil oftmals postet man ja auch selber etwas, und bei facebook werden ja auch seine Sachen angezeigt.
Ich hab jz schon das hier:
PHP:
INNER JOIN user AS u3 ON u3.userid = ".mysql_real_escape_string($userid)."

Aber das funktioniert nicht..
Aber warum? Müsste es doch..?
 
Wenn Du zusätzlich noch die von dir geposteten Beiträge haben willst, würde ich ein UNION-Statement verwenden. Damit hast Du 2 Statements deren gemeinsamen Ergebnismengen letztlich angezeigt werden Also:

PHP:
$sql = "SELECT *
FROM posts
INNER JOIN friendships ON posts.puserid = friendships.user2 AND friendships.user1 = ".$userid."
INNER JOIN users u1 ON u1.userid = friendships.user1
INNER JOIN users u2 ON u2.userid = friendships.user2

UNION

SELECT *
FROM posts
WHERE posts.userid = ".$userid;
$return = mysql_query($sql) or die($mysql_error);

wobei man in dem Fall dann sehr genau darauf achten muss, welche Spalten sich aus den Statements ergeben. Diese müssen identisch sein. Also solltest Du jetzt (wie man es auch immer machen sollte) auf das * im SELECT verzichten und die konkreten Spalten benennen, die Du brauchst. Z.B.:

PHP:
$sql = "SELECT posts.content, u2.vorname, u2.nachname
FROM posts
INNER JOIN friendships ON posts.puserid = friendships.user2 AND friendships.user1 = ".$userid."
INNER JOIN users u1 ON u1.userid = friendships.user1
INNER JOIN users u2 ON u2.userid = friendships.user2

UNION

SELECT posts.content, users.vorname, users.nachname
FROM posts, users
WHERE posts.userid = ".$userid."
 AND posts.userid = users.userid;
$return = mysql_query($sql) or die($mysql_error);

Sortierung fehlt natürlich hierbei noch :)
 
So ich habe ihn jz Modifiziert:
PHP:
$sql = "SELECT 
			posts.pid, posts.content, posts.puserid, posts.code, posts.ptime, u2.vorname, u2.nachname, u2.username, u2.userid
FROM posts
INNER JOIN friendships ON posts.puserid = friendships.user2 AND friendships.user1 = ".mysql_real_escape_string($userid)."
INNER JOIN user u1 ON u1.userid = friendships.user1
INNER JOIN user u2 ON u2.userid = friendships.user2


UNION


SELECT posts.pid, posts.content, posts.puserid, posts.code, posts.ptime
FROM posts, user
WHERE posts.puserid = '".mysql_real_escape_string($userid)."'
 AND posts.puserid = user.userid";
$return = mysql_query($sql) or die(mysql_error());

Aber ich bekomme immer diese Fehlermeldung:
Code:
[COLOR=#000000][FONT=Georgia]The used SELECT statements have a different number of columns[/FONT][/COLOR]

Kann mir jemand sagen weshalb?
 
Werbung:
Das hatte ich oben schon angedeutet und die Fehlermeldung ist auch eindeutig. Die Statements, die per UNION verknüpft werden, haben unterschiedliche Spalten, insbesondere eine unterschiedliche Spaltenanzahl, im Ergebnis. Du müsstest, da Du beim zweiten Statement nicht so viele Werte ermitteln kannst, künstliche Spalten ergänzen damit beide Statements letztlich die selbe Spaltenanzahl haben.

Code:
[..]SELECT posts.pid, posts.content, posts.puserid, posts.code, posts.ptime, '' AS vorname, '' AS nachname, '' AS username, '' AS userid
FROM posts, user[..]
 
mhhh, es gibt doch noch ein Problem..

Ich habe es mal getestet, also wenn (bei den friendships) die userid des $userid users (also der, welcher angemeldet ist) in der user1 Spalte steht geht alles, aber wenn die eigene id in der Spalte user2 steht, werden nur meine Posts angezeigt..

Wie soll ich das jz lösen? Noch ein dritter UNION?

Und da dann das ganze umgedreht?

Weil momentan werden nur die user2 berücksichtigt, wenn man selber in Spalte 1 (user1) steht.
Andersherum geht es nicht..

Wie soll ich das jetzt lösen?
 
Werbung:
Mmh, theoretisch ja, ein drittes Statement welches identisch zum ersten ist, nur statt user1 die user2-Spalte als Verbindung verwendet. Wäre vermutlich das einfachste.
 
Super danke threadi funktioniert jetzt alles :D

Jetzt kann Weihnachten wirklich kommen ;)

(gerade noch so vor dem 24. fertig :D )
 
Zurück
Oben