2012-02-11 56 views
0

我的数据库结构是这样的:简单SQL接合操作

Members table 

    |id|username|... 

    Messages table 
    |id|fromId|toId|content 

在消息表ID是指消息ID,在成员它指的是用户ID(这是相同的ID在fromId和toId)。我想要做的FROM消息的连接查询的WHERE拉动以下结果ID = SOME_MESSAGE_ID设置

|id(message id)|fromId|fromUsername(username that corresponds to fromId)|toId|toUsername(username that corresponds to toId)|content 

任何帮助,将不胜感激。

回答

1

加入成员表两次,但使用不同的别名:

SELECT 
    messages.id, 
    messages.fromId, 
    from_member.username AS fromUsername, 
    messages.toId, 
    to_member.username AS toUsername, 
    messages.content 
FROM messages 
JOIN members AS from_member ON from_member.id = message.fromId 
JOIN members AS to_member ON to_member.id = message.toId 
+0

啊,我不知道你可以加入两次。正是我在找什么。有一个upvote :) – user974896 2012-02-11 01:08:14

+0

只是一个简短的说明,使用'JOIN'将导致查询行为像一个'INNER JOIN'并且不会返回其中一个成员记录丢失的邮件。 – 2012-02-11 01:10:07

+0

还有一件事,表名全部小写,根据安装数据库服务器软件的操作系统,这可能是一个问题。有些区分大小写。 – 2012-02-11 01:20:27

1

如何:

SELECT `Message`.`id`, 
      `Message`.`fromId`, 
      `From`.`username` AS `fromUsername`, 
      `Message`.`toId`, 
      `To`.`username` AS `toUsername` 
      `Message`.`content` 
FROM  `Messages` AS `Message` 
LEFT JOIN `Members` AS `From` 
ON  `From`.`id` = `Message`.`fromId` 
LEFT JOIN `Members` AS `To` 
ON  `To`.`id` = `Message`.`toId` 
WHERE  `Message`.`id` = 1 

有关SELECT查询的详细信息,click here

+0

谢谢。你的LEFT JOIN比上面的JOIN更有效率,还是相同? – user974896 2012-02-11 01:38:46

+0

@ user974896 - 效率不高。唯一真正的区别是'LEFT JOIN'将返回NULL列,而不是返回一行。所以,举个例子,如果你删除了一个用户,'LEFT JOIN'仍然允许你看到这个消息,但是'username'会是'NULL'。 – 2012-02-11 03:51:52