我怎样才能为我以及跟随他的用户收到所有帖子

时间:2013-08-23 11:55:36

标签: mysql sql

我有3张桌子。

第一个是用户信息。 第二个是用户插入的帖子和user_id与用户表的关系。 第三个是我跟随他的用户和user_id与用户表的关系。

现在在主页上我需要显示我在其上插入的所有帖子以及我跟随他的用户插入到表格帖子中的位置。

我将尝试通过以下方式制作这个MySQL: -

SELECT * FROM users , 
        (SELECT * FROM events where ev_user_id in 
        (
        ( select * from follow where follow.fo_user_id = '".$user_id."' )
         ,  '".$user_id."'
         )
         ) as post
        where post.ev_user_id = users.id
        order by post.ev_date DESC limit $to , $from

其中$user_id是用户的ID。

这里我得到错误: -

Operand should contain 1 column(s)

如果我跟随一个用户进行其工作,但当我关注多个用户时,其显示错误。

我怎么能为我和我关注他的用户发布所有帖子

==================================== 事件表是帖子的表

CREATE TABLE `events` (
  `ev_id` int(11) NOT NULL auto_increment,
  `ev_user_id` int(11) NOT NULL,
  `ev_type` varchar(222) NOT NULL,
  `ev_text` text NOT NULL,
  `ev_pic` varchar(222) NOT NULL,
  `ev_date` varchar(22) NOT NULL,
  PRIMARY KEY  (`ev_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=211 ;

我跟随他的用户表

   CREATE TABLE `follow` (
      `fo_id` int(11) NOT NULL auto_increment,
      `fo_user_id` int(11) NOT NULL,
      `fo_user_id_follow` int(11) NOT NULL,
      `fo_date` varchar(22) NOT NULL,
      PRIMARY KEY  (`fo_id`),
      UNIQUE KEY `fo_user_id` (`fo_user_id`,`fo_user_id_follow`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

用户信息表

CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `fullname` varchar(222) NOT NULL,
  `username` varchar(60) NOT NULL,
  `password` varchar(64) NOT NULL,
  `email` varchar(50) NOT NULL,
  `address` varchar(300) NOT NULL,
  `phone` varchar(20) NOT NULL,
  `skype` varchar(20) NOT NULL,
  `facebook` varchar(40) NOT NULL,
  `msn` varchar(90) NOT NULL,
  `mobile` varchar(20) NOT NULL,
  `more` text NOT NULL,
  `time` varchar(50) NOT NULL,
  `lastlogin` varchar(50) NOT NULL,
  `role_id` tinyint(1) NOT NULL default '2',
  `code` varchar(7) NOT NULL,
  `active` tinyint(4) NOT NULL default '3',
  `wieght` int(11) NOT NULL,
  `tall` int(11) NOT NULL,
  `birthdate` varchar(20) NOT NULL,
  `gender` varchar(5) NOT NULL,
  `fat` int(11) NOT NULL,
  `fittnes` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  `pic` varchar(222) NOT NULL,
  `regdate` varchar(22) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=396 ;

4 个答案:

答案 0 :(得分:2)

这可以为您提供$ user_id按降序日期排序的用户的帖子和用户信息。

SELECT * FROM events
JOIN follow ON events.ev_user_id = follow.fo_user_id
JOIN users ON events.ev_user_id = user.id
WHERE follow.fo_user_id_follow = '".$user_id."'
ORDER BY events.ev_date DESC
LIMIT $to , $from

这是你想要的吗?不完全确定。

编辑:添加您自己的帖子以及您关注的用户的帖子。

SELECT * FROM events
JOIN follow ON events.ev_user_id = follow.fo_user_id
JOIN users ON events.ev_user_id = user.id
WHERE follow.fo_user_id_follow = '".$user_id."'
    OR events.ev_user_id = '".$user_id."'
ORDER BY events.ev_date DESC
LIMIT $to , $from
编辑:询问者的确切解决方案,达人已经理解了跟随关系的逆转。

SELECT * FROM events
JOIN follow ON events.ev_user_id = follow.fo_user_id_follow
JOIN users ON events.ev_user_id = users.id
WHERE follow.fo_user_id = '".$user_id."'
    OR events.ev_user_id = '".$user_id."'
ORDER BY events.ev_date DESC
LIMIT $to , $from"

答案 1 :(得分:1)

您收到的错误消息是因为您对返回多个列的子查询使用IN运算符。也许将SQL重写为:

SELECT * FROM users , 
    (SELECT * FROM events where ev_user_id in 
    (
    ( select user_id from follow where follow.fo_user_id = '".$user_id."' )
     ,  '".$user_id."'
     )
     ) as post
    where post.ev_user_id = users.id
    order by post.ev_date DESC limit $to , $from

答案 2 :(得分:0)

以下情况怎么样?

SELECT * FROM users 
INNER JOIN follow ON fo_user_id=users.id
INNER JOIN events ON ev_user_id IN (users.id,fo_user_id_follow)
WHERE users.id='$user_id' ORDER BY post.ev_date DESC LIMIT $to , $from

您可能会获得太多列,因为它会列出所有已连接表中的所有列。

  1. 修改:在'周围添加了user_id,以防users.id是varchar列...
  2. 编辑:扩展了user_id的条件:ev_user_id IN (users.id,fo_user_id_follow)
  3. <强>重写

    SELECT * FROM follow 
      INNER JOIN users ON users.id=ev_user_id IN (users.id,fo_user_id_follow)
      INNER JOIN events ON ev_user_id=users.id
    WHERE users.id='$user_id' ORDER BY post.ev_date DESC LIMIT $to , $from
    

    这应该为您提供有关所有用户(包括您自己)的信息以及这些用户跟随$user_id标识的用户的所有帖子。可能也不是一个好的选择,因为您将为每个帖子一次又一次地提供完整的用户信息。

    最好有两个查询和两个结果表:1。用户信息,2。这些用户的帖子。

    SELECT * FROM user 
      WHERE users.id IN ( 
        SELECT fo_user_id_follow FROM follow WHERE fo_user_id=$user_id ) 
      OR users.id=$user_id
    

    SELECT * FROM events 
      WHERE ev_user_id IN ( 
        SELECT fo_user_id_follow FROM follow WHERE fo_user_id=$user_id ) 
      OR ev_user_id=$user_id
    

答案 3 :(得分:0)

我想 - 你应该提供特定的列而不是* - (选择*来自follow where_fo_user_id ='“。$ user_id。”') 你可以试试下面的线 - 从follow_fo_user_id ='“。$ user_id。”'

中选择fo_user_id_follow。