2009-08-10 3 views
0

Ich frage mich, wie man SQL-Abfrage erstellt, um Nachrichten nur von Leuten zu erhalten, denen ich folge. Ich nehme an, dass das Erstellen einer SQL-Join-Abfrage der richtige Weg ist, aber ich weiß nicht wie. Könnte mir bitte jemand helfen?SQL, um Nachrichten nur von Leuten zu erhalten, denen ich folge

Ich habe diese drei Tabellen jetzt:

CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`username` VARCHAR(255) NOT NULL , 
`email` VARCHAR(255) NOT NULL , 
`password` VARCHAR(8) NOT NULL , 
`status` ENUM('active', 'inactive') NOT NULL 
) ENGINE = MYISAM ; 

CREATE TABLE `posts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`user_id` INT NOT NULL , 
`body` VARCHAR(140) NOT NULL , 
`stamp` DATETIME NOT NULL 
) ENGINE = MYISAM ; 

CREATE TABLE `following` (
`user_id` INT NOT NULL , 
`follower_id` INT NOT NULL , 
PRIMARY KEY (`user_id` , `follower_id`) 
) ENGINE = MYISAM ; 

Ihnen sehr für Ihre Antwort danken.

Antwort

1

So:

SELECT * FROM POSTS 
WHERE user_id IN (SELECT user_id FROM following 
    WHERE follower_id = @your_id) 
+1

Ich denke, eine Verbindung kann eine bessere Leistung erbringen. –

+1

Im Allgemeinen keine. Dies war ein Leistungsfehler in SQL Server 2000 (und möglicherweise anderen SQL-Anweisungen), den viele Benutzer dieser Version irrtümlicherweise als allgemeine Faustregel für SQL erkannt haben. Es gibt keinen logischen Grund dafür, dass IN langsamer ist als ein Join (es muss tatsächlich weniger Arbeit machen) und wie Joe Celko vor einigen Jahren schrieb, ist es im Allgemeinen nicht so. Auch in SQL Server 2005+ sind IN-basierte Subselects fast immer genau die gleichen wie ein Join oder sie haben nur marginale Leistungsunterschiede. – RBarryYoung

+0

Danke für die Information. Gilt das auch für "exits" -basierte Subselects? –

2

Versuchen Sie folgendes:

select p.body, p.stamp, pu.username 
from posts p 
    join 
    following f 
    on f.user_id = p.user_id 
    join 
    users you 
    on you.user_id = f.follower_id 
    join 
    users pu 
    on pu.user_id = p.user_id 
where you.username = 'obadja7' 
; 

... oder so ähnlich.

Rob

+0

Vielen Dank für Ihre Antwort Rob. – ivan73

2

Jetzt haben Sie drei Antworten: JOIN IN, EXISTS

SELECT * 
FROM POSTS p 
WHERE EXISTS (SELECT * 
    FROM following f 
    WHERE f.follower_id = @your_id AND f.user_id = p.user_id) 

ich verwenden würde, gibt es, weil im Allgemeinen:

  • es den gleichen Plan gibt (wie JOIN + IN, hängt von Duplikaten ab)
  • unterstützt zusammengesetzte Schlüssel (IN nicht)
  • gibt es keine n eed, um die Ausgabe zu duplizieren (zB JOIN)
+0

Vielen Dank für Ihre Antwort und Erklärung gbn :) – ivan73