1

我一直在尝试为会话用户获取朋友提要。但我最终要么一无所有,要么每个人都可以看到它。

表格格式 http://pastebin.com/XGYmpi5u

CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL,
  `password` varchar(32) NOT NULL,
  `first_name` varchar(32) NOT NULL,
  `last_name` varchar(32) NOT NULL,
  `email` varchar(1024) NOT NULL,
  `active` int(11) NOT NULL DEFAULT '0',
  `email_code` varchar(32) NOT NULL,
  `avatar` varchar(55) NOT NULL,
  `type` int(1) NOT NULL DEFAULT '0',
  `protected` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

CREATE TABLE IF NOT EXISTS `feeds` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `user_id` int(6) NOT NULL,
  `username` varchar(32) NOT NULL,
  `body` text NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

CREATE TABLE IF NOT EXISTS `buddys` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `user_one` int(6) NOT NULL,
  `user_two` int(6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

所以我的问题是,如何获取用户数据、他们发布的提要和好友提要。只有与好友成为朋友的用户才能看到他们发布的帖子,而其他人则看不到。

我试过代码:

$user_id = $_SESSION['user_id'];
    if ($getquery = mysql_query("SELECT * FROM feeds f
    INNER JOIN users u ON u.user_id = f.user_id 
    WHERE u.user_id = '$user_id' OR u.user_id IN 
    (SELECT b.user_one OR b.user_two FROM buddys b 
    WHERE b.user_one OR b.user_two = '$user_id')")){

但这显示了正确的用户提要,但与其中任何一个朋友成为朋友的用户仍然可以看到帖子。

users 和 feeds 表有类似的列。

+---+----------+
| ID | user_id |
+---+----------+

虽然哥们有

+----+----------+----------+
| ID | user_one | user_two |
+----+----------+----------+

如果表的字段设置为

+----+----------+---------+
| ID | user_one | user_two| 
+----+----------+---------+
| 1  |    3     |   5     |
+----+----------+---------+

如果它是 3,我想通过我的 ID 获取它并从用户 ID 5 获取提要。

顺便说一句,我希望它像 Facebook/Twitter 那样。

4

1 回答 1

0

老实说,我还没有阅读您所有的问题,但是...

你的子查询在这里:

... OR u.user_id IN 
    (SELECT b.user_one OR b.user_two FROM buddys b 
    WHERE b.user_one OR b.user_two = '$user_id')

你不能这样写。b.user_one OR b.user_two实际上变成了一个布尔表达式,其中0为假,其他一切都为真。所以你的查询基本上是

... OR u.user_id IN 
    (0, 1)

您必须使用UNION将两列合二为一。

... OR u.user_id IN 
    (SELECT b.user_one FROM buddys b 
     WHERE b.user_one = '$user_id'
     UNION
     SELECT b.user_two FROM buddys b 
     WHERE b.user_two = '$user_id'
    )

希望这已经解决了您的问题。如果没有,请给我一个快速反馈,我会阅读整个问题:)

于 2013-06-01T11:30:32.993 回答