SQL Abfrage - Frage

  • Hallo Community!
    Ich habe eine Frage bezüglich meiner SQL Abfrage, die ich für ein Projekt in meiner Schule brauche. Ich habe 3 Tabellen: User-Tabelle, Post-Tabelle, Freunde-Tabelle. Es sollen nun für einen Nutzer alle Posts ausgegeben werden, die er 1. selber gepostet hat und 2. die posts von den Freunden. Meine bisherige Abfrage ist:



    SQL
    SELECT tbl_posts.*,poster.name FROM tbl_posts 
    INNER JOIN tbl_friends AS friend ON friend.user_id = '1'
    INNER JOIN tbl_users AS poster ON tbl_posts.user_id = friend.friend_id OR tbl_posts.user_id = '1'
    ORDER BY tbl_posts.created_at DESC


    Nun bekomme ich aber für die Abfrage doppelte Datensätze, da er beide namen mit in die Ausgabe nimmt, obwohl die user_id des posts eine andere ist, als der poster.name sein sollte. Falls ihr die Tabellenstrukturen braucht, füge ich die gerne hier noch an


    Mit freundlichen Grüßen
    Adrian Rodriguez


    Edit, die Strukturen:


  • SQL
    SELECT * FROM tbl_posts
    Inner Join tbl_friends on tbl_posts.user_id = tbl_friends.user_id
    WHERE tbl_posts.user_id = 'DEIN BENUTZER'
    OR tbl_friend.friend_id='DEIN BENUTZER' // versuch mal so
  • Danke dir @carLos_dueKer, habe die Abfrage dann noch abgeändert, sodass ich auch den zugehörigen namen zum tbl_posts.user_id bekomme:

    SQL
    SELECT tbl_posts.*,tbl_users.name FROM tbl_posts 
    INNER JOIN tbl_friends ON tbl_posts.user_id = tbl_friends.user_id 
    INNER JOIN tbl_users ON tbl_users.id = tbl_posts.user_id 
    WHERE tbl_posts.user_id = :user_id OR tbl_friends.friend_id = :user_id ORDER BY tbl_posts.created_at DESC 
    LIMIT $start,$limit
  • Kein Problem,
    ja wie du es letztendlich machst ist dir überlassen wollte dir nur die grundlage schaffen.. konnte das auch nicht testen also weiß ich nicht ob das so funktionierte oder nicht.
    Scheinbar schon :D


    @Unique! ich muss dich aber darauf hinweisen das wenn der abgefragte user in der friends tabelle unter der spalte 'friends_id' steht das es nicht mit ausgegeben wird...


    heißt also das du theoretisch einfach bei einer neuen freundschaft zwei datensätze anlegst:


    Angenommen freund A(id:10) schließt freundschaft mit freund B(id: 20)


    müssen diese Datensätze angelegt werden:


    user_id | friend_id
    10 | 20
    20 | 10



    Grüße

  • @carLos_dueKer
    Das ist mir bewusst :3
    Aber danke trotzdem


    Edit:
    Nun möchte ich noch alle likes zählen, die in einer weiteren Tabelle anhand von Relationen eingespeichert sind, die Tabelle schaut so aus:

    Code
    CREATE TABLE `tbl_posts_likes` (
      `user_id` int(11) NOT NULL,
      `post_id` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;


    Nur bin ich ein bisschen verwirrt, wie ich das mache. Ich bekomme bereits posts, die min. 1 like haben, sonst erhalte ich keinen post


    Meine Abfrage:


    SQL
    SELECT tbl_posts.*,tbl_users.name,COUNT(tbl_posts_likes.post_id) AS likes
    FROM tbl_posts
    INNER JOIN tbl_friends ON tbl_posts.user_id = tbl_friends.user_id
    INNER JOIN tbl_users ON tbl_users.id = tbl_posts.user_id
    INNER JOIN tbl_posts_likes ON tbl_posts_likes.post_id = tbl_posts.id
    WHERE tbl_posts.user_id = :user_id OR tbl_friends.friend_id = :user_id
    ORDER BY tbl_posts.created_at DESC
    LIMIT $start,$limit

    Nur wie bekomme ich nun die anderen, auf denen keine likes gesetzt sind?


    @carLos_dueKer

  • geht viel einfacher... mach in die posts tabelle eine weitere spalte mit dem namen likes als Typ Integer... Wenn einer like drückt zählste die variable einfach hoch... brauchste halt nur die likes noch mit ausgeben und fertig @Unique!


    Mit deiner Variante kannst du halt überprüfen wer das geliket hat aber das brauchst du ja z.z garnicht


    Wenn das wirklich so läuft wie du das sagst, das versuch mal ein post von einem user auszugeben der garkeinen freund hat...


    /e kannst du mir mal deine DB per PN schicken, damit ich das alles testen kann?

  • @carLos_dueKer
    Sorry, ich dachte ich hätte dir schon eine Nachricht gesendet, aber dabei hatte ich sie einfach vergessen abzuschicken. Die Abfrage habe ich am Ende doch noch stark abgeändert und sie funktioniert nun einwandfrei(getestet in der Schule)



    SQL
    SELECT tbl_posts.*,tbl_users.name 
    FROM tbl_posts 
    INNER JOIN tbl_users ON tbl_posts.user_id = tbl_users.id 
    LEFT JOIN (SELECT * FROM tbl_friends fr WHERE fr.friend_id = '1') AS fr ON tbl_posts.user_id = fr.user_id 
    WHERE tbl_posts.user_id = '1' OR tbl_posts.user_id = fr.user_id 
    ORDER BY tbl_posts.created_at DESC

    Jetzt muss ich alle likes zählen und diese auch noch ausgeben. Dabei spielt die Tabelle tbl_posts_likes eine wichtige Rolle. Die Datenbank bekommst du per PN mit ein paar beispiel daten in der Posts, User und Freunde Tabelle