2010-09-10 5 views
0

user_tableune connexion à trois tables mysql et PHP?

user_id | username 
     1 | solomon 
     2 | muna 

table des messages

id user_id| message 
1  1 | this is my first message 
2  1 | this is my seocnd message 
3  2 | this is muna messgae  

table relation

leader | follower 
     1 | 2 
     |  

ce que je veux faire est un trois tables se rejoignent pour faire ressortir les messages d'amis de Muna, actuellement mouna suit salomon (comme indiqué sur le tableau des abonnés),

donc je veux que l'affichage soit comme ceci sur la page d'accueil de mona

Solomon "this is my my first message 
---------------------------------- 
solomon "this is my second message" 

p.s. Ceci est juste une base de données d'exemple, je voulais juste voir comment aborder le problème, et c'est ce que j'ai essayé jusqu'à présent!

select username, message, leader 
    from user, message, relationship where user.user_id =notes.user_id 
and user.user_id = relationship.leader and where user_id = $_SESSION['user_id'] 

* l'identifiant de session est mouna qui est user_id 2

+0

Dans votre réponse, vous n'utilisez pas joint, mais question TAged avec eux. –

+0

removed removed – getaway

+0

Vous utilisez actuellement des jointures. Juste la syntaxe implicite à l'ancienne que vous ne devriez pas utiliser! –

Répondre

5

Heres une façon de le faire

SELECT m.message,u.username FROM relationships r, messages m,users u WHERE m.user_id = r.leader AND r.leader = u.user_id AND u.user_id = 1 

Espacé

SELECT 
    m.message,u.username #here you can use m.* to retrieve all data 
FROM 
    relationships r,  #Here you can define what tables you want to use 
    messages m,   #within your query, always remember to do table_name letter 
    users u    #this will stop ambiguity within the queries 
WHERE 
    m.user_id = r.leader #make sure the message user id is the same as the leader id 
AND 
    r.leader = u.user_id #same as above just making the messages be filtered to the user_id 
AND 
    u.user_id = 1  #your overall id will be here, if this was 2 it would affect WHERE, and AND above. 

Dans l'application

$query = mysql_query('SELECT m.message,u.username FROM relationships r, messages m,users u WHERE m.user_id = r.leader AND r.leader = u.user_id AND u.user_id = ' . intval($_SESSION['user_id'])); 

while($row = mysql_fetch_assoc($query)) 
{ 
    echo sprintf("%s: %s",$row['username'],$row['message']); 
    echo "\r\n--------------------------------------------"; 
} 

Ceci est testé et fonctionne très bien sur la structure de tableau suivant.


CREATE TABLE IF NOT EXISTS `messages` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `message` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

INSERT INTO `messages` (`id`, `user_id`, `message`) VALUES 
(1, 1, 'test'), 
(2, 1, 'test 2'), 
(3, 2, 'test 3'); 

CREATE TABLE IF NOT EXISTS `relationships` (
    `leader` int(11) NOT NULL, 
    `follower` int(11) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `relationships` (`leader`, `follower`) VALUES 
(1, 2); 

CREATE TABLE IF NOT EXISTS `users` (
    `user_id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(255) NOT NULL, 
    PRIMARY KEY (`user_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

INSERT INTO `users` (`user_id`, `username`) VALUES 
(1, 'solomon'), 
(2, 'muna'); 
+0

ouah !!! Nous sommes si heureux – getaway

+0

merci et votre accueil. – RobertPitt

+0

a également ajouté des commentaires afin que vous puissiez apprendre la requête. – RobertPitt

4

Je ne suis pas vraiment sûr de ce que votre question. Cela ressemble-t-il à une réponse?

SELECT u.username, 
     m.message 
FROM user u 
     JOIN message m 
     ON  u.user_id =m.user_id 
     JOIN relationship r 
     ON  u.user_id = r.leader 
WHERE u.user_id   = $_SESSION['user_id'] 
+0

# 1052 - Colonne 'user_id' dans où clause est ambiguë, merci – getaway

+2

'WHERE u.user_id = $ _SESSION ['user_id']' devrait corriger cela. –

+0

@premiso - Merci! –