komplizierte Datenbankabfrage
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anweisung
anzahl
art
code
datum
eintrag
erledigen
fassen
freund
freundschaft
hinterkopf
limit
neuigkeit
not
ordern
sinn
tabelle
url
verwenden
-
Hallo liebes Forum,
ich bin gerade am Ende meiner SQL/PHP Kentnisse angelangt und stehe vor einer großen Herausforderung.
Es geht um 2 Tabellen: friendships und news
friendships ist folgendermaßen aufgebaut: id | user1ID | user2ID und stellt die Freundschaft zwischen 2 Usern dar.
news: id | userID | typeID in der Tabelle stehen News von Usern drinnen. UserID ist der User der die Neuigkeit geschrieben hat und typeID der Typ der Nachricht.
Nun will ich eine Abfrage erstellen, die alle Ergebnisse aus der Tabelle news ausgibt, die von Freunden geschrieben wurden sind. Diese Freundschaften sind wie gesagt in der frienships Tabelle gespeichert, das Problem dabei ist, dass eine von diesen userID´s die eigene UserID, von dem User der zur Zeit online, ist und sich gerade die News durchliest. Aus diesem Grund kann ich kein einfaches
machen. Ich weiß nun einfach nicht wie ich das allles hinkriege: Die Abfrage, welchee die Freunde von dem User sind, ob die user1ID oder die user2ID die ID des Freundes und dann noch die Abfrage aus der news Tabelle..WHERE news.userID = friendships.user1ID OR news.userID = friendships.user2ID
Das ganze kann man sich wie die Neuigkeiten Seite auf Facebook vorstellen.
Ich weiß das ist vielleicht nicht ganz so einfach zu verstehen, aber ich kann es leider einfach nicht besser in Wörter fassen.
Vielen Dank für eure Antworten. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich persönlich würde das mit PHP umsetzen. Zuerst liest du alle Freunde aus, dann deren geschriebene Nachrichten.
Aber ich glaube, es gibt auch Möglichkeiten, mit einer einzigen Sql-Abfrage.Irgendwas mit Union Select hab ich noch im Hinterkopf, aber ich kann mich auch täuschen.
Edit:
Nein, es waren Unterabfragen.
Ich zeige jetzt mal meine Abfrage, die wohl funktioniert. Es werden aber meiner Meinung nach alle Neuigkeiten in der Datenbank durchsucht, was die Abfrage bald schon sehr langsam machen könnte.
SELECT userID, typeID FROM news WHERE (SELECT COUNT(*) FROM friendships WHERE (user1ID=77777 && user2ID=news.userID) || (user1ID=news.userID && user2ID=77777));
An Stelle von 77777 (taucht 2mal auf) musst du die ID des aktuell angemeldeten Benutzers einsetzen.
Aber wenn du sehr viele User bekommst, und nicht gerade jeder mit jedem befreundet ist, dann suche nach etwas besserem.
Beitrag zuletzt geändert: 27.8.2014 20:02:46 von fuerderer -
Hallo erstmal..
naja ich würde da du ja weißt welcher user gerade online ist
.... AND NOT xxx.userid = $aktueller_user
schreiben (dann musst du nur mehr darauf achten dass du die klammern richtig setzt )
LG -
Hallo,
bei der oben genannten Möglichkeit würde es vielleicht noch sinn machen via
LIMIT die Anzahl zu begrenzen...
alternativ könntest auch einen Join verwenden
z.B. so in der art
SELECT friendships.*, news.* FROM news JOIN friendships ON news.userid = friendships.userid2 WHERE news.userid != '$aktueller_user' and friendships.userid1 = '$aktueller_user' ORDER BY datum desc LIMIT 1,20;
Gruß
VA / Akashia -
akashia schrieb:
Wenn ich mich nicht irre, wird diese Anweisung fehlschlagen, weil friendships.userid2 keinen eindeutigen Index besitzt. Das heißt es kommen Duplikate in der Spalte vor.
SELECT friendships.*, news.* FROM news JOIN friendships ON news.userid = friendships.userid2 [...]
rglinitz schrieb:
So wie ich es beobachtet habe, reicht es wenn man nur die Beiträge der Freunde anzeigt.
[...]
ich würde da du ja weißt welcher user gerade online ist
.... AND NOT xxx.userid = $aktueller_user
schreiben
Die eigenen sind da nicht dabei, denn man ist ja nicht mit sich selbst befreundet.
(zumindest nicht in der DB ) -
Hallo volnerius,
es schaut so aus als wolltest du sowas erreichen.
Am einfachsten und effizientesten ist dies mit Joins zu erledigen.
Allerdings bin ich mir nicht ganz sicher ob nur ein Eintrag oder zwei Eintrag (letzteres wäre sinnvoller) pro Freundschaft erstellt wird. Wenn nur ein Eintrag erstellt wird so musst du tatsächlich dies verwenden:
akashia schrieb:
Hallo,
bei der oben genannten Möglichkeit würde es vielleicht noch sinn machen via
LIMIT die Anzahl zu begrenzen...
alternativ könntest auch einen Join verwenden
z.B. so in der art
SELECT friendships.*, news.* FROM news JOIN friendships ON news.userid = friendships.userid2 WHERE news.userid != '$aktueller_user' and friendships.userid1 = '$aktueller_user' ORDER BY datum desc LIMIT 1,20;
Gruß
VA / Akashia
Wenn du jedoch zwei Einträge pro Freundschaft machst, dann ist die von mir verwendete Variante im SQLFiddle vermutlich für dich interessanter.
Ich persönlich würde die zwei-Eintrag-Variante benutzen, da dadurch die SQL Abfrage einfacher wird. Es verdoppelt sich allerdings auch die Datenbankgröße logischerweise. Aber das ist deine persönliche Entscheidung.
MfG
karlsve -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage