【问题标题】:how can i get all post for me and for user who i follow him我怎样才能为我和我关注他的用户获取所有帖子
【发布时间】:2013-08-23 11:55:35
【问题描述】:

我有 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)

如果我关注一个用户,它的工作,但是当我关注多个用户时,它会显示在错误上方。

我怎样才能为我和我关注他的用户获取所有帖子

===================================== events 表是 post 的表

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 ;

【问题讨论】:

  • 显示所有 3 个表的至少 2 条记录的样本数据
  • 为什么在你的声明中使用双括号(())
  • @M Shahzad Khan 此查询中没有数据,它显示错误Operand should contain 1 column(s)
  • 对不起,我发现这个问题令人困惑,你能举一个你想要的表格的例子吗?显然,这很容易通过几个连接来解决。
  • @cars10 我需要显示我关注他的用户的所有帖子和我的帖子

标签: mysql sql


【解决方案1】:

这应该会为您提供您的 $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"

【讨论】:

  • 它只显示我关注他的帖子,我的帖子没有显示
  • 好的,你也想要自己的帖子吗?我也对其进行了编辑以得到它。它给了你现在想要的东西吗?一般来说,最好选择您想要的字段,而不是使用 *.干杯!
  • 它必须像这样显示我SELECT * FROM events JOIN users ON events.ev_user_id = users.id JOIN follow ON events.ev_user_id = follow.fo_user_id WHERE follow.fo_user_id_follow = '".$user_id."' and events.ev_user_id = '".$user_id."' ORDER BY events.ev_date DESC LIMIT $to , $from 但它没有行:(
  • 你有一个 AND 挖掘一个 OR。编辑:它有效吗?完美的!不要忘记接受和投票:)
  • 对不起,我会尝试,但不会让我发布我关注他为什么的用户帖子
【解决方案2】:

您收到的错误消息是因为您对返回多列的子查询使用 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

【讨论】:

    【解决方案3】:

    我猜 - 您应该在该行提供特定列而不是 * - ( select * from follow where follow.fo_user_id = '".$user_id."' ) 您可以尝试以下行 - select fo_user_id_follow from follow where follow.fo_user_id = '".$user_id."'

    【讨论】:

    • 我会使用它,但结果显示不止一条记录,我无法在查询中使用它
    【解决方案4】:

    接下来呢?

    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)

    重写

    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
    

    【讨论】:

    • 所以它只显示我的帖子,我需要为我和我像 facebook 一样关注他的用户显示所有帖子
    • 好的,我在这里为我和我关注他的用户发帖,但当我看到用户时显示我的名字
    • 我需要我关注的所有用户获取我的用户信息和他的帖子,在您的查询中获取我的用户帖子并加入我的信息
    • “当我看到用户时为我显示名称”是什么意思?你更希望拥有什么?
    • 看,我需要为我和我关注他的用户显示所有 wpost,现在在您的查询中将在同一行显示我的帖子和我的用户信息,当我看到我关注他的用户行,它为他显示帖子,我的用户信息错误,它必须为他查看用户信息
    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 2012-10-28
    • 2013-09-05
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多