2009-08-10 10 views
0

Je me demande comment créer une requête SQL pour obtenir des messages uniquement des personnes que je suis. Je suppose que créer une requête de jointure SQL est la bonne façon, mais je ne sais pas comment. S'il vous plaît quelqu'un pourrait-il m'aider?SQL pour obtenir des messages seulement des gens que je suis

J'ai ces trois tables maintenant:

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 ; 

Merci beaucoup pour votre réponse.

Répondre

1

Comme ceci:

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

Je pense qu'une jointure peut donner de meilleures performances. –

+1

Généralement pas. C'était un "bogue" de performance dans SQL Server 2000 (et peut-être d'autres SQL) que de nombreux utilisateurs de cette version ont cru à tort est une règle générale pour tout le SQL. Il n'y a pas de raison logique pour que IN soit plus lent qu'une jointure (il doit effectivement faire moins de travail) et comme Joe Celko l'a écrit il y a plusieurs années, ce n'est généralement pas le cas. Même sur SQL Server 2005+, les sous-sélections basées sur l'IN sont presque toujours identiques à une jointure ou ne présentent qu'une différence de performance marginale. – RBarryYoung

+0

Merci pour l'information. Est-ce aussi vrai pour les sous-groupes 'existes '? –

2

Essayez ceci:

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' 
; 

... ou quelque chose comme ça.

Rob

+0

Merci pour votre réponse Rob. – ivan73

2

Maintenant vous avez 3 réponses: 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) 

j'utiliser EXISTE parce que généralement:

  • donne au même plan (comme JOIN + IN, dépend des doublons)
  • prend en charge les touches composites (IN ne fait pas)
  • il n'y a pas n EED pour dédupliquer la sortie (par exemple JOIN)
+0

Merci pour votre réponse et explication gbn :) – ivan73