mysql复杂的连接

时间:2011-12-17 20:59:15

标签: mysql left-join

我在为MySQL编写查询时遇到了一些麻烦。我不知道如何很好地描述我的问题以便在网上搜索它,如果我的问题很愚蠢,那就很抱歉。

我有3张桌子:

CREATE TABLE posts( id INT, author INT );
CREATE TABLE users( id INT, nick varchar(64) );
CREATE TABLE groups( id INT, name varchar(64) );
CREATE TABLE membership (user INT, group INT, date INT ) ;

成员资格包含有关已加入某些群组的用户的信息。成员资格表中的“日期”是用户加入该组的时间。

我需要一个查询,它会返回一个帖子,作者的昵称以及加入日期最少的组名。

目前我只有:

SELECT p.id, u.nick, g.name
FROM posts AS p 
    LEFT JOIN users AS u ON u.id = p.author 
    LEFT JOIN membership AS m ON m.user = p.author
    LEFT JOIN groups AS g ON g.id = m.group
WHERE 1;

但当然它会返回一个随机组的名称,而不是具有最早加入日期的名称。

我还尝试了以下变体:

SELECT p.id, u.nick, g.name
FROM posts AS p 
    LEFT JOIN users AS u ON u.id = p.author 
    LEFT JOIN 
              (SELECT * FROM membership WHERE 1 ORDER BY date ASC) 
              AS m ON m.user = p.author
    LEFT JOIN groups AS g ON g.id = m.group
WHERE 1;

但它给了我相同的结果。

我甚至会感激指向我可以开始的地方,因为目前我不知道如何处理它。

3 个答案:

答案 0 :(得分:0)

像这样的东西

SELECT p.id, u.nick, g.name
  FROM posts p,
       users u,
       membership m,
       groups g
 WHERE p.author = u.id
   AND m.user = u.id
   AND m.group = g.id
 ORDER BY m.date ASC
 LIMIT 1;

加入这4个表时要注意保持良好的索引。

答案 1 :(得分:0)

我不知道你为什么要这么做,但是,如果你想要最早成员资格日期的信息(因为没有发布日期的日期),没问题。现在,我们有最早的会员资格,总是指向同一个人,因为你没有要求特定的团体..(或者你是否想要最早的人PER会员群 - 这就是我要写的查询)。现在,我们有最早的用户,可以链接到帖子表(显然是作者),但如果有人在他们的名字下有20个帖子怎么办...你是否也想要该作者的第一个ID。

只需从提供的表中复制作为参考... posts:id(int),author(int) 用户:id(int),nick(varchar) groups:id(int),name(varchar) 成员资格:user(int),group(int),date(int)

select
      u1.nick,
      m2.date,
      g1.name,
      p1.id as PostID
   from 
      ( select m.group, 
               min( m.date ) as EarliestMembershipSignup
           from
              Membership m
           group by 
              m.group ) EarliestPerGroup

      join Membership m2
         on EarliestPerGroup.Group = m2.Group
        AND EarliestPerGroup.EarliestMembershipSignup = m2.Date

         join groups g1
            on m2.group = g1.id

         join users u1
            on m2.user = u1.ID

            join posts p1
               on u1.id = p1.author

答案 2 :(得分:0)

我建议您将会员列表中的日期列移动到您的群组表中,因为这似乎是您跟踪该信息的位置。成员资格表只是多对多用户< - >组表的交集表。它应该只包含用户ID和组ID列。

这个怎么样?

SELECT p.id, u.nick, g.name 
FROM 
  users u, 
  posts p, 
  groups g
INNER JOIN membership m
  ON u.id = m.user
INNER JOIN groups 
  ON m.group = groups.id
ORDER BY g.timestamp DESC
LIMIT 1;